Публикация нескольких библиотек Android как одной с помощью Fused Library

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

Плагин Fused Library, входящий в состав Android Gradle Plugin, помогает упаковывать несколько модулей Android Library в единую публикуемую библиотеку 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 в блок plugins в файле build.gradle.kts верхнего уровня.
  4. Для создания модуля myFusedLibrary создайте новую директорию с именем myFusedLibrary (щелкните правой кнопкой мыши по «Мое приложение» > Создать > Директория).
  5. Создайте файл build.gradle.kts в модуле myFusedLibrary (щелкните правой кнопкой мыши по модулю myFusedLibrary > Создать > Файл).
  6. Вставьте следующий код в файл myFusedLibrary/build.gradle.kts :

Котлин

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 . Транзитивные зависимости не упаковываются.

Например:

Котлин

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 , поскольку он предоставляет необходимые зависимости для компиляции артефакта объединенной библиотеки.

Вот пример конфигурации публикаций:

Котлин

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
        }
    }
}

Опубликуйте свою объединенную библиотеку для тестирования.

Вам следует протестировать зависимость от опубликованной библиотеки Fusion из Android-приложения или Android-библиотеки. Рекомендуемый метод — опубликовать библиотеку Fusion и её зависимости проекта в локальном репозитории Maven.

Для публикации артефактов объединенной библиотеки в локальный репозиторий необходимо определить конфигурацию, аналогичную следующей:

Котлин

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 имеет свои сложности, которые могут затруднить для плагина определение приоритетов. Например, две библиотеки с одинаковым путем к классам приведут к ошибке сборки при их объединении. При слиянии ресурсов будет учитываться порядок зависимостей, указанный при выборе ресурса с одинаковым именем в разных библиотеках.

  • Объединенные библиотеки можно опубликовать только в виде AAR-архива библиотеки Android, чтобы добавить их в качестве зависимости.
  • Объединение библиотек, использующих привязку данных, не поддерживается.
  • В одной библиотеке объединенных компонентов нельзя объединять несколько типов сборок и вариантов продукта. Создавайте отдельные библиотеки объединенных компонентов для разных вариантов.

Для обеспечения баланса между объемом необходимой конфигурации и простотой использования плагин либо завершит сборку с ошибкой при неоднозначных конфликтах, либо будет использовать эвристические методы при объединении артефактов. Подробная информация о том, как происходит объединение артефактов, приведена в следующей таблице:

Тип Поведение
Классы Наличие библиотек с одинаковым путем к классам приведет к ошибке сборки при объединении библиотек.
Ресурсы Android При слиянии ресурсов будет учитываться порядок зависимостей, указанный при выборе ресурса с одинаковым именем в разных экземплярах.
Метаданные AAR Объединение версий метаданных AAR осуществляется с приоритетом наивысшего значения из каждой библиотеки зависимостей. Для переопределения этих значений предусмотрен DSL.

Котлин

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Ресурсы Java Наличие нескольких файлов ресурсов Java в разных библиотеках с одинаковыми путями недопустимо и приведет к ошибке сборки.

Известные проблемы

Fused Library — это новый плагин, и в настоящее время ведутся работы над устранением известных проблем для обеспечения возможности его использования во всех сценариях.

  • Исходные JAR-файлы не могут быть сгенерированы.
  • Добавление зависимостей файлов от других файлов .aar.
  • Отсутствует поддержка объединения артефактов RenderScript и Prefab.

Разберитесь в зависимостях объединенной библиотеки.

Библиотека fused не имеет исходных кодов и фактически использует библиотеки Android в качестве единственного источника, поэтому важно понимать, что откуда берется. Чтобы перечислить зависимости, которые объединяются в результирующий артефакт, и зависимости, необходимые для сборки артефакта, запустите задачу gradle :report для библиотеки fused. Задача генерирует отчет в формате JSON, который сохраняется в каталоге build/reports библиотеки fused.

Для получения дополнительной информации о внутренних зависимостях плагина запустите задачу gradle :dependencies , чтобы просмотреть состояние конфигураций плагина.