Как упаковать собственные готовые библиотеки для разных платформ Android

#android #android-studio #gradle #cmake #android-ndk

#Android #android-studio #gradle #cmake #android-ndk

Вопрос:

Для компиляции собственных готовых библиотек мы используем NDK toolchain с этими двумя опциями -DANDROID_ABI , и -DANDROID_PLATFORM , таким образом, в случае, если мы поддерживаем android-28 , android-29 платформы и armeabi-v7a , arm64-v8a , x86 , x86_6 ABI, нам понадобятся наборы созданных библиотек:

 .
├── android-28
│   ├── arm64-v8a
│   │   └── libMy.so
│   ├── armeabi-v7a
│   │   └── libMy.so
│   ├── x86
│   │   └── libMy.so
│   └── x86_64
│       └── libMy.so
└── android-29
    ├── arm64-v8a
    │   └── libMy.so
    ├── armeabi-v7a
    │   └── libMy.so
    ├── x86
    │   └── libMy.so
    └── x86_64
        └── libMy.so

 

Мы можем легко использовать такие готовые сборки в Android cmake, потому что он поддерживает ${ANDROID_PLATFORM} и ${ANDROID_ABI} переменные, например CMakeLists.txt :

 ...
list(APPEND CMAKE_FIND_ROOT_PATH ${THIRDPARTY_PREBUILT_DIR}/${ANDROID_PLATFORM}/${ANDROID_ABI}/mylib)
...
 

Но упаковка этих готовых библиотек в APK кажется мне непонятной, потому app/src/main/jniLibs что не поддерживает иерархию платформ, а только ABI:

 .
└── jniLibs
    ├── arm64-v8a
    │   └── libMy.so
    ├── armeabi-v7a
    │   └── libMy.so
    ├── x86
    │   └── libMy.so
    └── x86_64
        └── libMy.so
 

А также та же структура в выходных app-debug.apk/lib данных .

Итак, вопрос: почему у нас есть опции toolchain и Android cmake для разных платформ, но упаковка собственных библиотек (библиотек jni) игнорирует их?

Я использую Android Studio 3.6.3 с. Gradle 5.6.4

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

1. Нужно ли вам иметь отдельные библиотеки для этих двух уровней платформы, или вы могли бы объединить их в одну библиотеку? Если они действительно должны быть отдельными библиотеками, то вы можете захотеть создать отдельные пакеты приложений / APK для разных минимальных уровней API (см., Например developer.android.com/studio/build /… ).

2. @Michel: Спасибо за комментарий. Мне нужно создать несколько сторонних библиотек, а затем использовать их как готовые в проекте приложения Android, но для их компиляции NDK toolchain требует, чтобы я указал -DANDROID_PLATFORM параметр, но эти библиотеки не зависят от конкретного API Android (28 или 29 или что-то еще), только приложение должно поддерживать 28 и 29. Поэтому я сделаю так, как ответил @Dan Albert — применю самую старую версию для компиляции сторонних библиотек.

Ответ №1:

Вы можете выбрать платформу как часть сборки, потому что это определяет, с какими устройствами ваш код будет совместим. Если вы нацелены на 21, ваш код не гарантированно будет работать на чем-либо более старом, чем Lollipop.

Однако приложения совместимы с пересылкой, поэтому, если вы создаете для 21, вы будете работать на Lollipop и все остальное после (за очень редкими исключениями, крайне редкими, если вы придерживаетесь определенного поведения общедоступных API). Вот почему вам не нужно упаковывать библиотеку для каждой платформы, только для самой старой, которую вы поддерживаете.