Обертывание собственных библиотек (файлы SO) в архив Android (файл aar)

Я хочу сделать что-то концептуально простое, но для которого я не могу найти никакой документации. У меня есть определенные библиотеки, для которых я скомпилировал SO-файлы для всех интересующих меня платформ.

Теперь я хотел бы просто создать файл AAR, содержащий эти файлы so.

Я знаю, что файл AAR должен иметь такую ​​структуру: /jni//mylib.so

Теперь я знаю, какие манифесты/другие метаданные я должен создавать.

В идеале было бы здорово сгенерировать это с помощью Gradle, но мне просто нужно, чтобы это было сделано, поэтому имеет смысл также написать простой скрипт, создающий zip, а затем переименовать его.


person Federico Tomassetti    schedule 17.12.2015    source источник
comment
Обычно Android Studio создает для вас файлы AAR. Вы просто убедитесь, что библиотеки находятся в каталоге jniSrc. Последний экспериментальный плагин добавляет чистые нативные зависимости.   -  person Alex Cohn    schedule 17.12.2015
comment
Возможный дубликат Как мне упаковать файлы .so в мой .aar архив?   -  person skywinder    schedule 23.11.2016


Ответы (1)


Публикация AAR, содержащего собственные библиотеки, довольно проста. Среди обнаруженных мной преимуществ:

  • При использовании для нескольких проектов, конечно, есть преимущество в том, чтобы не дублировать собственный код.
  • Сборка приложения выполняется намного быстрее, так как вам не нужно выполнять компиляцию NDK в приложении. Итак, если нативный код меняется реже
  • В моем случае была несовместимость с некоторыми комбинациями NDK и SDK. Возможность собрать библиотеку с более старым SDK и приложением с более новой версией работает очень хорошо. (предотвращает зависание моего приложения в более старой версии SDK из-за проблемы с NDK)
  • могут иметь модульные тесты для кода библиотеки, которые полностью независимы от любого приложения. (Модульные тесты приложений также могут тестировать библиотеку)

Компромисс заключается в том, что есть несколько дополнительных шагов для обновления c-кода, но если он меняется реже, чем приложение, то это хороший компромисс.

Стоит отметить, что я получаю предупреждение: Current NDK support is deprecated. Alternative will be provided in the future. при каждой сборке. Насколько я знаю, альтернатива еще недоступна - мое определение устаревшего будет заключаться в том, что оно не устарело, пока это не произойдет.

Вот ключевые моменты того, как это работает у меня:

  • код c и cpp находится в папке src/main/jni
  • app/build.gradle (многое из этого относится и к использованию NDK в проекте приложения):

    • apply plugin: 'maven' at top under apply plugin: 'com.android.library'
    • Добавьте заголовок c/cpp, содержащий каталоги в блоке android:

      sourceSets.main {
        jni.srcDirs 'src/main/jni/Thirdparty/lib1/headers', ... 
      }
      
    • под android/defaultConfig (независимо от того, какие параметры могут понадобиться вашему собственному коду):

          ndk {
            moduleName "module_name"
            cFlags "-std=gnu++11 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -D__STDC_LIMIT_MACROS -fexceptions"
            ldLibs "log"
            stl "gnustl_static"
          }
      
    • Вне блока Android - чтобы сообщить Gradle, как опубликовать библиотеку в репозитории maven. Это просто нажимает на локальный каталог репозитория Android sdk, но также возможно нажимать на общие репозитории (в настоящее время я также нажимаю на внутренний репозиторий Nexus - код gradle для этого не включен здесь)

      uploadArchives {
        repositories {
          mavenDeployer {
          repository(url: "file://localhost" + System.getenv("ANDROID_HOME") + "/extras/android/m2repository/")
          pom.version = '1.0-SNAPSHOT'
        }
        pom.groupId = 'com.example.groupid'
        pom.artifactId = 'library_name'
      }
      
  • ./gradlew uploadArchives затем публикует действительный aar в моем локальном репо, и я могу зависеть от него из проекта приложения, используя с compile 'com.example.groupid:library_name:1.0-SNAPSHOT' в app/build.gradle в блоке android/dependencies
  • под обложками android sdk объединяет aar в apk приложения, как если бы они были созданы как часть проекта приложения (включая ряд файлов jni/*/module_name.so)
person Stan Kurdziel    schedule 21.12.2015
comment
могут ли заголовки из папки jni также быть упакованы в aar? - person igagis; 17.02.2016