Как опубликовать несколько библиотек Android в виде одной с помощью Fused Library

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

Плагин Fused Library, входящий в состав плагина Android Gradle, помогает упаковать несколько модулей библиотеки Android в одну публикуемую библиотеку Android. Это позволяет вам модулировать исходный код и ресурсы библиотеки в сборке по своему усмотрению, не раскрывая структуру проекта после распространения.

Распространение в виде единой библиотеки может иметь следующие преимущества:

  • Упрощенные зависимости. Вместо нескольких зависимостей библиотек используется один файл AAR, что упрощает настройку проекта и управление версиями для пользователей.
  • Уменьшение размера библиотеки. Может улучшить сжатие кода, что приведет к уменьшению размера AAR.
  • Повышенная безопасность. Улучшенный контроль над внутренней реализацией опубликованных библиотек.

Как создать объединенную библиотеку

Чтобы создать объединенную библиотеку, необходимо создать новый модуль Android, добавить зависимости, а затем опубликовать объединенную библиотеку.

Требования

Чтобы использовать плагин Fused Library, установите AGP 9.0 или более поздней версии. В предыдущих версиях плагина Fused Library наблюдалось другое поведение и возникали проблемы, которые были устранены в AGP 9.0.

Добавьте новый модуль объединенной библиотеки

Чтобы использовать плагин, добавьте в проект новый модуль Android:

В этом примере модуль объединенной библиотеки будет называться myFusedLibrary.

  1. Добавьте include(":myFusedLibrary") в файл settings.gradle.kts.
  2. Добавьте android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } в раздел [plugins] файла gradle/libs.versions.toml.
  3. Добавьте alias(libs.plugins.android.fusedlibrary) apply false в блок плагинов в файле build.gradle.kts верхнего уровня.
  4. Чтобы создать модуль myFusedLibrary, создайте каталог с названием myFusedLibrary (нажмите правой кнопкой мыши на My Application > New > Directory).
  5. Создайте файл build.gradle.kts в модуле myFusedLibrary (нажмите правой кнопкой мыши на модуль myFusedLibrary > "Создать" > "Файл").
  6. Вставьте в файл 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 и посмотрите состояние конфигураций плагинов.