使用融合库将多个 Android 库作为一个发布

在包含许多模块的项目中,向用户分发 Android 库,同时尝试保持清晰的项目结构,可能具有挑战性。在许多情况下,需要发布的库数量比预期多得多。

Android Gradle 插件捆绑的融合库插件有助于将多个 Android 库模块打包成一个可发布的 Android 库。这使您可以在构建中根据需要对库的源代码和资源进行模块化,同时避免在分发后暴露项目的结构。

以单个库的形式分发具有以下优势

  • 简化的依赖项:用单个 AAR 替换多个库依赖项,从而简化用户的项目设置和版本管理
  • 减小的库大小:可以改进代码收缩,从而生成更小的 AAR
  • 改进的安全性:可以更好地控制已发布库的内部实现细节

创建融合库

要构建融合库,您必须创建一个新的 Android 模块,添加依赖项,然后发布融合库。

添加新的融合库模块

要使用该插件,您必须向项目添加新的 Android 模块

在此示例中,融合库模块将命名为 myFusedLibrary

  1. 通过将 android.experimental.fusedLibrarySupport=true 添加到 gradle.properties 文件来启用融合库支持。
  2. include(":myFusedLibrary") 附加到 settings.gradle.kts 文件中。
  3. [plugins] 部分下添加 android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }gradle/libs.versions.toml 文件中。
  4. 在顶层 build.gradle.kts 文件的 plugins 代码块中添加 alias(libs.plugins.android.fusedlibrary) apply false
  5. 要创建 myFusedLibrary 模块,请创建一个名为 myFusedLibrary 的新目录(右键点击“我的应用”> 新建 > 目录)。
  6. myFusedLibrary 模块中创建 build.gradle.kts 文件(右键点击 myFusedLibrary 模块 > 新建 > 文件)。
  7. 将以下内容粘贴到 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 Plugin 也必须应用于任何已应用融合库插件的模块。
  • 发布必须继承自 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 发布,才能作为依赖项添加。
  • 不支持融合使用数据绑定的库。
  • 您不能在单个融合库中融合多种构建类型和产品变种。请为不同的变体创建单独的融合库。

为了平衡所需的配置量和易用性,插件在融合构件时,会在模糊冲突时使构建失败,或使用启发式方法。构件融合的详细信息请参见下表

类型 行为
当融合库时,具有相同类路径的库将导致构建失败。
Android 资源 资源合并在选择不同库中具有相同名称的资源时,将考虑指定依赖项的顺序。
AAR 元数据 AAR 元数据版本通过优先从每个依赖库中选择最高值进行合并。提供了 DSL 来覆盖这些值。

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Java 资源 多个库中具有相同路径的 Java 资源文件是不允许的,这将导致构建失败。

已知问题

融合库是一个新插件,存在一些正在解决的已知问题,以满足所有用例。

  • lint.jar 文件未包含在融合 AAR 中
  • 添加对其他 .aar 文件的文件依赖项
  • 不支持融合 RenderScript 和 Prefab 构件

了解融合库的依赖项

融合库没有源代码,实际上只使用 Android 库作为其唯一来源,因此了解哪些内容来自何处非常重要。要列出合并到结果构件中的依赖项以及构建构件所需的依赖项,请在融合库上运行 gradle :report 任务。该任务会生成一个 JSON 报告,该报告保存在融合库的 build/reports 目录中。

如需有关内部插件依赖项的其他信息,请运行 gradle :dependencies 任务以查看插件配置的状态。