Как содержимое lib попадает в файл Android *.apk?

Апк-файлы 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....


person humanityANDpeace    schedule 09.03.2016    source источник


Ответы (1)


Использование zip вполне безопасно (пока в будущей версии Android не будут внесены серьезные изменения). Вы можете работать с aapt, но он не принимает хороший флаг recursive. Вы можете ознакомиться с системным кодом, который извлекает общие библиотеки. В этом нет никакой магии, он открывает таблицу содержимого ZIP-файла (также известного как APK) и ищет файлы, соответствующие поддерживаемому ABI.

person Alex Cohn    schedule 10.03.2016
comment
спасибо, только одна вещь об этом критическом изменении: известно, что это то, чем занимаются разработчики Android, то есть вносят критические изменения, или они более Microsoft и ломают, сохраняя изменения, то есть заботятся об обратной совместимости? - person humanityANDpeace; 10.03.2016
comment
Природа мобильных ОС такова, что обратная совместимость имеет важное значение. Не все устройства можно обновить, и, с другой стороны, ожидается, что старые приложения будут работать после обновления OTA. Но дело не в том, что критических изменений в крайних случаях никогда раньше не было; и это может произойти на каком-то изолированном форке, таком как Amazon, или на полуфорке (то есть с сильно настроенным AOSP), как у Samsung. Открытый исходный код здесь часто помогает, ошибки легче отслеживать, а иногда проще найти обходной путь. В частности, что касается установки собственных библиотек, я лично столкнулся с парой угловых ошибок. - person Alex Cohn; 10.03.2016