Как объединить статические библиотеки Android с разными ABI?

#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, оптимизированных для каждой архитектуры устройства, чтобы уменьшить как хранилище, так и пропускную способность загрузки для ваших пользователей.

https://developer.android.com/guide/app-bundle

Комментарии:

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