在包含许多模块的项目中,在尝试保持清晰的项目结构的同时,向用户分发 Android 库可能是一项艰巨的任务。在许多情况下,需要发布的库比预期多得多。
与 Android Gradle 插件捆绑在一起的 Fused Library 插件可帮助将多个 Android 库模块打包成一个可发布的 Android 库。这样一来,您就可以根据需要在 build 中将库的源代码和资源模块化,同时避免在分发后暴露项目的结构。
以单个库的形式分发具有以下优势:
- 简化的依赖项:用单个 AAR 替换多个库依赖项,从而为用户简化项目设置和版本管理
- 减小库大小:可能会改进代码缩减,从而生成更小的 AAR
- 更高的安全性:可以更好地控制已发布库的内部实现细节
创建融合库
如需构建融合库,您必须创建新的 Android 模块、添加依赖项,然后发布融合库。
添加新的融合库模块
如需使用该插件,您必须向项目添加新的 Android 模块:
在此示例中,融合库模块将称为 myFusedLibrary
。
- 通过向
gradle.properties
文件添加android.experimental.fusedLibrarySupport=true
来启用融合库支持。 - 将
include(":myFusedLibrary")
附加到settings.gradle.kts
文件。 - 在
gradle/libs.versions.toml
文件的[plugins]
部分下添加android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }
。 - 在顶级
build.gradle.kts
文件中的插件代码块中添加alias(libs.plugins.android.fusedlibrary) apply false
。 - 如需创建
myFusedLibrary
模块,请创建一个名为myFusedLibrary
的新目录(右键点击“我的应用”>“新建”>“目录”)。 - 在
myFusedLibrary
模块中创建build.gradle.kts
文件(右键点击myFusedLibrary
模块 > 新建 > 文件)。 - 将以下内容粘贴到
myFusedLibrary/build.gradle.kts
文件中:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Groovy
plugins { id 'fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
添加依赖项
融合库的核心功能是捆绑依赖项。该插件支持添加本地项目依赖项和外部库。
如需指定要打包的依赖项,请使用 include
配置。
系统不会打包传递依赖项。
例如:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Groovy
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"]) } } }
Groovy
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 制品库。
如需将融合库制品发布到本地代码库,请定义类似于以下内容的配置:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
Groovy
plugins { id 'fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
上传融合库
如需分发融合库,请参阅上传库。
行为和安全措施
合并 Android 库的复杂性可能会使插件难以推断优先级。例如,如果两个库具有相同的类路径,则在融合库时会导致构建失败。资源合并在选择不同库中具有相同名称的资源时,会考虑指定的依赖项顺序。
- 融合库只能作为 Android 库制品 AAR 发布,以便添加为依赖项。
- 不支持融合使用数据绑定的库。
- 您无法在单个融合库中融合多个 build 类型和产品变种。为不同的变体创建单独的融合库。
为了平衡所需的配置量和易用性,插件会在出现模糊冲突时使 build 失败,或者在融合制品时使用启发式方法。下表详细说明了如何融合制品:
类型 | 行为 |
---|---|
类 | 如果库具有相同的类路径,则在融合库时会导致 build 失败。 |
Android资源 | 资源合并将考虑在不同位置选择同名资源时指定的依赖项顺序。 |
AAR 元数据 | AAR 元数据版本会通过优先考虑每个依赖库中的最高值进行合并。系统提供了一个 DSL 来替换这些值。KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
Java 资源 | 不允许多个库中存在路径相同的 Java 资源文件,否则会导致 build 失败。 |
已知问题
Fused Library 是一款新插件,目前存在一些已知问题,我们正在努力解决这些问题,以满足所有使用情形。
- 无法生成源 JAR 文件
- 添加对其他 .aar 文件的文件依赖项
- 不支持融合 RenderScript 和 Prefab 制品
了解融合库的依赖项
融合库没有来源,实际上仅使用 Android 库作为其来源,因此了解来源非常重要。如需列出合并到生成的制品中的依赖项以及构建制品所需的依赖项,请对融合库运行 gradle :report
任务。该任务会生成一个 JSON 报告,并将其保存在融合库的 build/reports
目录中。
如需详细了解内部插件依赖项,请运行 gradle :dependencies
任务以查看插件配置的状态。