Апк-файлы Android-приложений на самом деле представляют собой zip-файлы. Используя (JNI), т.е. собственный код означает добавление файлов *.so в ваш apk. Мой вопрос в том, как они на самом деле попадают в файл apk?
Пока я знаю, что, глядя на пример, как такие *.so
создаются и используется изнутри Java-кода. Что я уже знаю, так это то, как такие файлы в конечном итоге хранятся внутри архива apk/zip:
res/
assets/
META-INF/
lib/
|<arch1>
|libSharedNativeLib1.so
|libSharedNativeLib2.so
|<arch2>
|libSharedNativeLib1.so
|libSharedNativeLib2.so
AndroidManifest.xml
classes.dex
resources.arsc
Я также знаю, как делаются записи classes.dex
,AndroidManifest.xml
,resources.arsc
,assets
,res
и META-INFO
. Это последовательность aapt
, jarsigner
. Единственное, чего я не знаю, так это то, что теперь lib
помещается в apk.
Фон
Я люблю, чтобы все было просто. Использование таких IDE, как Android Studio
и Eclipse
, кажется здесь хорошим способом сократить время, поскольку они держат пользователей в некотором неведении относительно того, что происходит automagically
на фоне фактического процесса сборки (выполняется с помощью различных инструментов сборки, таких как ANT , Maven, Grandle, Groovy...)
Хотя в таких инструментах нет ничего действительно плохого, они, как правило, сокращают объем знаний, необходимых для создания apk, и, следовательно, сокращают документацию о ручном способе достижения того же самого. Мне бы очень помогло узнать, что на самом деле делает Грандл, когда zip-файлы попадают в архив apk/zip.
Прямо сейчас я проверил, и это, кажется, работает
zip -r appfile.apk lib
и тестирование показало, что при установке системы Android действительно скопировано и связано правильное родное приложение lib*.so, а именно
root@armdev:/data/data/name.package # ls -l total 12 drwxr-x--x 2 10142 10142 4.0K . drwxrwx--x 103 1000 1000 8.0K .. lrwxrwxrwx 1 1012 1012 42 lib -> /data/app/name.package/lib/arm
Теперь можно предположить, что Android pm install appfile.apk
просто ищет структуру папок lib внутри файла apk/zip
, копирует файлы lib*so на место и связывает их с /data/data/name.package/lib
, но я действительно хотел бы знать, есть ли в этом что-то еще, не так, чтобы зависеть только от удачи с командой zip
выше.
Я уже пробовал -A
(для активов) и -S
(для ресурсов) aapt
, но ни один из них не помог включить папку lib в файл apk через aapt
.
, в конечном итоге будет упакован в apk-файл в папке lib//lib*.so
Я хочу разработать некоторое программное обеспечение для Android (файл *.apk/приложение), и я не использую IDE, такие как Android Studio или Eclipse, а также инструменты для сборки, такие как Grandle, Maven или Ant....