#android #static-libraries #static-linking #abi
#Android #статические библиотеки #статическое связывание #abi
Вопрос:
Я создал статическую библиотеку Android 4 раза, каждый с разным ABI. Итак, у меня есть эти файлы:
someLib_armeabi-v7a.a
someLib_arm64-v8a.a
someLib_x86.a
someLib_x86_64.a
Как я могу (если это возможно) объединить их в одну библиотеку, которая будет содержать все ABI?
Заранее спасибо.
Ответ №1:
Вы не можете.
Это файлы, содержащие машинный код, каждый для разной архитектуры процессора, и не существует формата файла, который позволяет вам собрать их все вместе и позволить загрузчику решать, что загружать.
Также обратите внимание, что *.a
файлы являются статическими библиотеками и не могут использоваться напрямую. Вам необходимо связать их с динамической библиотекой — *.so
файлом, прежде чем их можно будет добавить в ваше приложение.
На Android при создании APK собственные библиотеки упаковываются в отдельные папки внутри APK (которые на самом деле являются ZIP), названные в честь ABI, например: /lib/arm64-v8a/someLib.so
или /lib/armeabi-v7a/someLib.so
Эта упаковка выполняется автоматически системой сборки при условии, что вы правильно настроили свой проект, и это необходимо для того, чтобы ОС на устройстве находила и использовала библиотеку.
Однако Google рекомендует использовать «пакеты приложений», которые автоматически разделят ваш APK на несколько разных APK, оптимизированных для каждой архитектуры устройства, чтобы уменьшить как хранилище, так и пропускную способность загрузки для ваших пользователей.
Комментарии:
1. Большое вам спасибо за ваш ответ. Я был сбит с толку, потому что для статических библиотек iOS или macOS команда libtool может использоваться для объединения большего количества библиотек с разными архитектурами в одну конечную библиотеку. Так что это не вариант для библиотек Android. Еще раз спасибо.
2. @peco Архитектура Android сильно отличается от архитектуры iOS, Mac OS и даже обычного GNU / LInux, когда дело доходит до использования собственных библиотек, потому что все пользовательское пространство — это виртуальная машина Java. Вы должны использовать JNI для взаимодействия с собственным кодом (C / C ), использовать очень специфические имена функций для вашей библиотеки и размещать библиотеку в определенных местах. Подробнее об этом можно прочитать здесь: developer.android.com/ndk/samples/sample_hellojni и вот здесь: developer.android.com/studio/projects/add-native-code и еще один для пущей убедительности developer.android.com/training/articles/perf-jni