Intereting Posts

Библиотека с зависимостями связок (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 с локальными модулями. Он должен делать локальное слияние манифеста и далекое jar … и объединять зависимости всех модулей. Должны отображаться только внешние модули.

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

Кто-нибудь когда-нибудь делал что-то подобное? Вне 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' } по 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 …

Solutions Collecting From Web of "Библиотека с зависимостями связок (fat aar)"

У меня было аналогичное требование, поэтому после многого поиска я в конечном итоге взломал свой путь через плагин Android. Я не очень хорошо разбираюсь, но мне удалось собрать файл градиента, который создает жирный файл 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, так как я их не использую. Следующие функции присутствуют и работают для меня (хотя мои библиотеки не слишком сложны)

  1. Слияние классов (так что proguard работает над объединенными кланами)
  2. Слияние активов и библиотек JNI
  3. Слияние манифеста
  4. Слияние ресурсов
  5. Встраивание библиотек из одного проекта
  6. Встраивание библиотек из хранилищ Maven

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

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

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

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

Он в основном такой же, как и у адвира.

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

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

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

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

Я действительно не понимаю обоснования команды Android, не позволяя вставлять одну библиотеку Android в другую (кроме «сложной»), но с текущей ситуацией намного проще сохранить все файлы Android в одном модуле.

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