Подтвердить что ты не робот

Библиотека с зависимостями связок (fat aar)

Мы создаем библиотеку, которую мы распространяем для наших клиентов. Мы распространяем необработанные файлы aar для их использования. Также мы используем API-интерфейс необработанного доступа GitHub для предоставления репозитория Maven.

Теперь, чтобы сохранить порядок вещей, мы разделили библиотеку на несколько модулей:

include ':library'
include ':geohash'
include ':networkstate'
include ':okvolley'
include ':volley'

library - это Android-библиотека, поэтому volley и okvolley и networkstate.

Теперь, когда я публикую library, дерево зависимостей выглядит следующим образом:

\--- com.sensorberg.sdk:sensorberg-sdk:0.10.0-SNAPSHOT
 +--- com.squareup.okhttp:okhttp-urlconnection:2.2.0
 |    \--- com.squareup.okhttp:okhttp:2.2.0
 |         \--- com.squareup.okio:okio:1.2.0
 +--- com.google.code.gson:gson:2.3.1 
 +--- android-sdk:okvolley:unspecified
 |    +--- com.squareup.okhttp:okhttp-urlconnection:2.2.0 (*)
 |    +--- com.google.code.gson:gson:2.3.1
 |    +--- android-near-gradle:volley:unspecified
 |    \--- com.squareup.okhttp:okhttp:2.2.0 (*)
 +--- android-sdk:networkstate:unspecified
 +--- com.squareup.okhttp:okhttp:2.2.0 (*)
 +--- android-sdk:volley:unspecified
 \--- com.loopj.android:android-async-http:1.4.5

Как вы можете видеть, android-sdk:networkstate:unspecified и android-sdk:okvolley:unspecified отображаются в списке внешних зависимостей.

Я хотел бы создать мой library aar с локальными модулями в комплекте. Он должен делать локальное слияние манифеста и далекое jar... и объединять зависимости всех модулей. Только внешние модули должны показывать.

Я попытался ссылаться на локальный файл aar из папки build/output/aar соответствующих модулей, но это также, похоже, не работает. По-прежнему кажется, что они ссылаются на локальные модули по их именам и не объединяют манифесты jar...

Кто-нибудь когда-нибудь делал что-то подобное? Вне Android это будет называться fatjar, и есть плагины, такие как musketyr/gradle-fatjar-plugin, которые производят fatjar с Gradle.

Я пробовал это на своих локальных модулях

if (project.ext.libraryBuild == true) {
    def moduleName = getName()
    File artifactFile = file("/build/outputs/aar/${moduleName}-release.aar")
    if (!artifactFile.exists()) {
        throw new GradleException("Dependency ${moduleName} is not build")
    }
    configurations.create("default")
    artifacts.add("default", artifactFile)
    return;
}


apply plugin: 'com.android.library'

android {
    compileSdkVersion 19
    buildToolsVersion = '21.1.2'
}

для ссылки на aar напрямую...

4b9b3361

Ответ 1

У меня было аналогичное требование, поэтому после долгих поисков я в конечном итоге взломал свой путь через плагин Android. Я не знаю groovy много, но мне удалось собрать файл gradle, который создает жирный файл aar, принятый приложением.

Полученный код доступен в github.com/adwiv/android-fat-aar. Подробные инструкции приведены на сайте GitHub. Результат build.gradle будет выглядеть следующим образом:

apply from: 'fat-aar.gradle'

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])

  embedded project(':libraryone')
  embedded project('com.example.internal:lib-three:1.2.3')

  compile 'com.android.support:appcompat-v7:22.2.0'
}

Текущий код не пытается слить файлы AIDL, так как я их не использую. Следующие функции присутствуют и работают для меня (хотя мои библиотеки не слишком сложны)

  • Слияние классов (поэтому proguard работает над объединенными кланами)
  • Слияние активов и библиотек JNI
  • Слияние манифолей
  • Слияние ресурсов
  • Встраивание библиотек из одного проекта
  • Встраивание библиотек из репозиториев Maven

Только встроенные библиотеки (aar) могут быть встроены, а не файлы jar, хотя файлы jar в папках libs встроенных библиотек распаковываются и объединены.

Попробуйте и дайте мне знать любые проблемы. Вы можете пройти через код и изменить его в соответствии с вашими потребностями.

Ответ 2

Я просто не рекомендую делать библиотеку Android в зависимости от другой библиотеки Android. Официальной поддержки связывания библиотеки Android в выходном файле aar нет (см.: fooobar.com/questions/151946/...), и я не думаю, что это произойдет в обозримом будущем.

Таким образом, в настоящее время проще всего хранить все компоненты, связанные с Android, в одном модуле, а другие модули - в формате Java.

Создать простой Java-модуль довольно просто (просто скопируйте выходные классы или выходной jar в свою библиотеку Android в Gradle), но модули Android намного сложнее. В какой-то момент был хороший сценарий grad https://github.com/adwiv/android-fat-aar. К сожалению, он больше не поддерживается и не работает с последним плагином Android Gradle. А изменения в плагине Android плохо документированы, поэтому создание (и поддержка) вашего собственного плагина/скрипта было бы очень болезненным.

Я действительно не понимаю, почему Android-команда не позволяет встраивать одну android-библиотеку в другую (не считая "это сложно"), но в текущей ситуации гораздо проще хранить все android-вещи в одном модуле.

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

Ответ 3

Связанный aar официально не поддерживается. Вот ответ от технологического руководителя в Google.

Я создаю плагин gradle, который взламывает плагин android: fat-aar-plugin.

В основном это так же, как и adwiv.

Надеюсь, что это поможет.