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

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

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

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

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

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

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

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

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

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

  1. Включите поддержку библиотек Fusion, добавив android.experimental.fusedLibrarySupport=true в файл gradle.properties .
  2. Добавьте include(":myFusedLibrary") в файл settings.gradle.kts .
  3. Добавьте android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } в раздел [plugins] в файле gradle/libs.versions.toml .
  4. Добавьте alias(libs.plugins.android.fusedlibrary) apply false в блоке плагинов в файле build.gradle.kts верхнего уровня.
  5. Чтобы создать модуль myFusedLibrary , создайте новый каталог с именем myFusedLibrary (щелкните правой кнопкой мыши «Мое приложение» > Создать > Каталог).
  6. Создайте файл build.gradle.kts в модуле myFusedLibrary (щелкните правой кнопкой мыши модуль myFusedLibrary > Создать > Файл).
  7. Вставьте следующее в файл myFusedLibrary/build.gradle.kts :

Котлин

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

androidFusedLibrary {
    namespace = "com.example.myFusedLibrary"
    minSdk = 21
}

dependencies { }

Круто

plugins {
    id 'fused-library'
}

androidFusedLibrary {
    namespace 'com.example.myFusedLibrary'
    minSdk 21
}

dependencies {

}

Добавить зависимости

Основная функциональность библиотеки Fused — это связывание зависимостей. Плагин поддерживает добавление локальных зависимостей проекта и внешних библиотек. Чтобы указать зависимости, которые необходимо упаковать, используйте конфигурацию 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 , поскольку это обеспечивает требуемые зависимости, необходимые для компиляции артефакта fusion-библиотеки.

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

Котлин

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 '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.

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

Котлин

plugins {
    alias(libs.plugins.android.fusedlibrary)
    `maven-publish`
}

repositories {
    maven {
        name = "myLocalRepo"
        url = uri(layout.buildDirectory.dir("myLocalRepo"))
    }
}

Круто

plugins {
    id 'fused-library'
    id 'maven-publish'
}

repositories {
    maven {
        name 'myLocalRepo'
        url layout.buildDirectory.dir('myLocalRepo')
    }
}

Загрузите вашу объединенную библиотеку

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

Поведение и меры безопасности

Объединение библиотек Android имеет свои тонкости, которые могут затруднить для плагина рассуждения о приоритетах. Например, две библиотеки с одинаковым classpath вызовут сбой сборки при слиянии библиотеки. Слияние ресурсов будет учитывать порядок зависимостей, указанный при выборе ресурса с одинаковым именем в разных библиотеках.

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

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

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

Котлин

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

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

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

  • Файлы lint.jar не включены в объединенный AAR
  • Добавление зависимостей файлов от других файлов .aar
  • Нет поддержки объединения артефактов RenderScript и Prefab.

Понять зависимости объединенной библиотеки

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

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