В проектах с большим количеством модулей может быть сложно распространять библиотеки Android среди пользователей, сохраняя при этом четкую структуру проекта. Во многих случаях приходится публиковать больше библиотек, чем планировалось.
Плагин Fused Library, входящий в состав плагина Android Gradle, помогает упаковать несколько модулей библиотеки Android в одну публикуемую библиотеку Android. Это позволяет вам модулировать исходный код и ресурсы библиотеки в сборке по своему усмотрению, не раскрывая структуру проекта после распространения.
Распространение в виде единой библиотеки может иметь следующие преимущества:
- Упрощенные зависимости. Вместо нескольких зависимостей библиотек используется один файл AAR, что упрощает настройку проекта и управление версиями для пользователей.
- Уменьшение размера библиотеки. Может улучшить сжатие кода, что приведет к уменьшению размера AAR.
- Повышенная безопасность. Улучшенный контроль над внутренней реализацией опубликованных библиотек.
Как создать объединенную библиотеку
Чтобы создать объединенную библиотеку, необходимо создать новый модуль Android, добавить зависимости, а затем опубликовать объединенную библиотеку.
Требования
Чтобы использовать плагин Fused Library, установите AGP 9.0 или более поздней версии. В предыдущих версиях плагина Fused Library наблюдалось другое поведение и возникали проблемы, которые были устранены в AGP 9.0.
Добавьте новый модуль объединенной библиотеки
Чтобы использовать плагин, добавьте в проект новый модуль Android:
В этом примере модуль объединенной библиотеки будет называться myFusedLibrary.
- Добавьте
include(":myFusedLibrary")в файлsettings.gradle.kts. - Добавьте
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }в раздел[plugins]файлаgradle/libs.versions.toml. - Добавьте
alias(libs.plugins.android.fusedlibrary) apply falseв блок плагинов в файлеbuild.gradle.ktsверхнего уровня. - Чтобы создать модуль
myFusedLibrary, создайте каталог с названиемmyFusedLibrary(нажмите правой кнопкой мыши на My Application > New > Directory). - Создайте файл
build.gradle.ktsв модулеmyFusedLibrary(нажмите правой кнопкой мыши на модульmyFusedLibrary> "Создать" > "Файл"). - Вставьте в файл
myFusedLibrary/build.gradle.ktsследующий код:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Яркий
plugins { id 'com.android.fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
Добавьте зависимости
Основная функция объединенной библиотеки – объединение зависимостей. Плагин поддерживает добавление локальных зависимостей проекта и внешних библиотек.
Чтобы указать зависимости, которые нужно упаковать, используйте конфигурацию include.
Транзитивные зависимости не упаковываются.
Например:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Яркий
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
Опубликуйте объединенную библиотеку
Прежде чем публиковать объединенную библиотеку, ознакомьтесь с информацией о том, как опубликовать библиотеку Android. Публикация объединенной библиотеки похожа на публикацию библиотеки Android, однако есть некоторые ключевые различия, которые необходимо учитывать для правильной публикации объединенной библиотеки:
- Плагин Maven Publish также должен быть применен к любому модулю, к которому применен плагин Fused Library.
- Публикация должна наследовать от
fusedLibraryComponent, поскольку это обеспечивает необходимые зависимости, требуемые для компиляции артефакта объединенной библиотеки.
Вот пример конфигурации изданий:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { … } dependencies { … } publishing { publications { register<MavenPublication>("release") { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" from(components["fusedLibraryComponent"]) } } }
Яркий
plugins { id 'com.android.fused-library' id 'maven-publish' } androidFusedLibrary { … } dependencies { … } publishing { publications { release(MavenPublication) { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" afterEvaluate { from components.fusedLibraryComponent } } }
Опубликуйте объединенную библиотеку для тестирования
Протестируйте зависимость от опубликованной объединенной библиотеки в приложении Android или библиотеке Android. Рекомендуемый способ – опубликовать объединенную библиотеку и ее зависимости в локальном репозитории Maven.
Чтобы опубликовать артефакты объединенной библиотеки в локальном репозитории, задайте конфигурацию, аналогичную следующей:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
Яркий
plugins { id 'com.android.fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
Загрузите объединенную библиотеку
Чтобы распространять объединенную библиотеку, ознакомьтесь с разделом Загрузка библиотеки.
Поведение и меры защиты
Объединение библиотек Android имеет свои особенности, которые могут затруднить определение приоритетов плагином. Например, если у двух библиотек одинаковый путь к классам, при их объединении произойдет ошибка сборки. При объединении ресурсов будет учитываться порядок зависимостей, указанный при выборе ресурса с тем же именем в разных библиотеках.
- Объединенные библиотеки можно публиковать только как артефакт библиотеки Android (AAR), чтобы их можно было добавлять в качестве зависимости.
- Объединение библиотек, использующих привязку данных, не поддерживается.
- В одной объединенной библиотеке нельзя объединять несколько типов сборки и версий продукта. Создайте отдельные объединенные библиотеки для разных вариантов.
Чтобы сбалансировать объем необходимой конфигурации и простоту использования, плагин либо не выполнит сборку при неоднозначных конфликтах, либо будет использовать эвристику при объединении артефактов. Подробные сведения о том, как объединяются артефакты, приведены в таблице ниже.
| Тип | Поведение |
|---|---|
| Курсы | Библиотеки с одинаковым путем к классам вызовут сбой сборки при объединении библиотеки. |
| Разработка под Android | При объединении ресурсов будет учитываться порядок зависимостей, указанный при выборе ресурса с тем же названием в другом. |
| Метаданные автоматического применения рекомендаций | Версии метаданных AAR объединяются по приоритету наивысшего значения из каждой библиотеки зависимостей. Для переопределения этих значений предусмотрен DSL. Kotlin androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
| Ресурсы Java | Файлы ресурсов Java в нескольких библиотеках с одинаковыми путями не допускаются и приведут к сбою сборки. |
Известные проблемы
Fused Library – это новый плагин, и мы работаем над устранением известных проблем, чтобы он подходил для всех сценариев использования. Если вы столкнетесь с проблемами, сообщите нам об ошибках.
- Проблема 454305444. Библиотеки, содержащие правила ProGuard для потребителей, которые не называются proguard.txt, приводят к сбою сборки. Исправлено в AGP 9.1 и более поздних версиях.
- Проблема 374982739. Добавление зависимостей файлов в другие файлы AAR.
- Проблема 231433225. Нет поддержки для объединения артефактов RenderScript и Prefab
Как понять зависимости объединенной библиотеки
У объединенной библиотеки нет источников, и она эффективно использует библиотеки Android в качестве единственного источника. Важно понимать, что откуда берется. Чтобы получить список зависимостей, объединенных в результирующий артефакт, и зависимостей, необходимых для его сборки, выполните задачу gradle :report для объединенной библиотеки. Задача генерирует отчет в формате JSON, который сохраняется в каталоге build/reports объединенной библиотеки.
Чтобы получить дополнительные сведения о зависимостях внутренних плагинов, запустите задачу gradle :dependencies и посмотрите состояние конфигураций плагинов.