Упаковка бинарника linux в apk для Android

Если я хочу включить двоичный файл Linux (например, ffmpeg) в свой файл .apk (только для устройств на базе ARM), возможно ли его распространение для телефонов без рута? Я знаю, что можно вызвать включенный двоичный файл с помощью Runtime.exec(), но рекомендуется ли это?


person StackOverflowed    schedule 26.02.2013    source источник


Ответы (2)


Вы можете хранить двоичный файл в папке res/raw или в папке assets. Таким образом, он будет развернут на устройстве. Вы должны «извлечь» его после установки, ваш /data/data/your.package/files/ является допустимым местом назначения; /sdcard/ нет. Обычное место назначения /data/local/ недоступно для вашего приложения, даже если оно предназначено для оболочки adb. chmod 500 тоже нормально.

При этом libffmpeg.so с оболочками JNI проще использовать в приложении для Android и требует меньше системных ресурсов.


Обновление, апрель 2014 г. Вы можете обмануть систему и сохранить двоичный файл в папке libs/armeabi и позволить программе установки извлечь этот двоичный файл для вас. Он окажется в папке /data/data/your.package/lib/ с правами доступа +x. У этого хака есть еще одно приятное преимущество: он позволяет системе выбрать правильный ABI для извлечения бинарного файла для: armeabi, armeabi-v7a, mips, или x86.

Хитрость заключается в том, чтобы следовать соглашению об именах общих библиотек. Итак, когда вы помещаете исполняемый файл ffmpeg в libs/armeabi, переименуйте файл в lib_ffmpeg_.so. Естественно, вы также Runtime.exec() будете использовать для файла полный путь, а также новые добавленные префикс и суффикс.

person Alex Cohn    schedule 26.02.2013
comment
Достаточно распространено запускать собственные исполняемые файлы из приложений Android, но вы должны знать, что это не одобряется разработчиками Android. Они продолжают угрожать отключить это средство в будущем, поскольку не могут регулировать использование ресурсов этими процессами так же точно, как для основного процесса приложения. - person Adrian Taylor; 27.02.2013
comment
Спасибо @AlexCohn. Знаете ли вы об оболочке FFMPEG JNI, которая использует последнюю версию FFMPEG? (Предпочтительнее 2.0 и выше?). - person StackOverflowed; 05.04.2014
comment
@StackOverflowed: нет, я не отслеживаю десятки оболочек и производных ffmpeg. - person Alex Cohn; 05.04.2014
comment
@JonesV да, это так. Я не тестировал это на устройствах Android Pie, но нет задокументированных изменений, которые могли бы нарушить эту функцию. Одно предупреждение: к сожалению, это не будет работать с android:extractNativeLibs=false . - person Alex Cohn; 21.01.2019

Я не думаю, что вы сможете пометить их как + x без рута.

При использовании ffmpeg обычно создается оболочка JNI для libffmpeg.

person alex    schedule 26.02.2013
comment
Кажется, этот проект может это сделать, поэтому я поднял вопрос: github.com/guardianproject/ android-ffmpeg - person StackOverflowed; 26.02.2013