组件化库开发资源合并等注意事项
在开发库模块和相关应用时,请注意以下行为和限制。
向 Android 应用模块添加对库模块的引用后,您可以设置它们的相对优先级。在构建时,库会按照优先级由低到高的顺序逐一与应用合并。
-
资源合并冲突
构建工具会将库模块中的资源与相关应用模块的资源合并。如果这两个模块中都定义了给定的资源 ID,系统会使用应用中的资源。
如果多个 AAR 库之间发生冲突,系统会使用依赖项列表中首先列出的库(靠近
dependencies
块顶部)中的资源。为了避免常用的资源 ID 发生资源冲突,请考虑使用对模块具有唯一性(或在所有项目模块之间具有唯一性)的前缀或其他一致的命名方案。
-
在多模块构建中,系统会将 JAR 依赖项视为传递依赖项
在向输出 AAR 的库项目添加 JAR 依赖项时,JAR 会由库模块进行处理,并与其 AAR 打包在一起。
不过,如果您的项目包含库模块,并且此模块已被应用模块使用,应用模块便会将库的本地 JAR 依赖项视为传递依赖项。在这种情况下,本地 JAR 将由使用它的应用模块进行处理,而不是由库模块进行处理。这是为了加快库代码更改导致的增量构建的速度。
由本地 JAR 依赖项导致的所有 Java 资源冲突都必须在使用相应库的应用模块中解决。
-
库模块可以依赖于外部 JAR 库
您可以开发一个依赖于外部库(例如 Google 地图外部库)的库模块。在这种情况下,相关应用必须针对包含此外部库的目标(例如 Google API 插件)进行构建。另外也要注意,库模块和相关应用都必须在其清单文件的
<uses-library>
元素中声明外部库。 -
应用模块的
minSdkVersion
必须等于或大于库定义的版本库是作为相关应用模块的一部分进行编译的,因此,库模块中使用的 API 必须与应用模块支持的平台版本兼容。
-
每个库模块都会创建自己的 R 类
在您构建相关应用模块时,库模块会先编译到 AAR 文件中,然后再添加到应用模块中。因此,每个库都有自己的
R
类,并根据库的软件包名称命名。所需的所有软件包中都会创建从主模块和库模块生成的R
类,包括主模块的软件包和库的软件包。 -
库模块可以包含自己的 ProGuard 配置文件
如果有用于构建和发布 AAR 的库项目,您可以向库的构建配置添加 ProGuard 配置文件,并且 Android Gradle 插件规则适用于您指定的 ProGuard 规则。构建工具会将此文件嵌入到为库模块生成的 AAR 文件中。在您将库添加到应用模块后,库的 ProGuard 文件会附加到应用模块的 ProGuard 配置文件 (
proguard.txt
)。通过将 ProGuard 文件嵌入到库模块中,您可以确保依赖于相应库的应用模块不必手动更新其 ProGuard 文件即可使用此库。当 Android Studio 构建系统构建您的应用时,它会同时使用来自应用模块和库的指令。因此无需按照单独的步骤在库上运行代码缩减器。
如需向库项目添加 ProGuard 规则,您必须使用
consumerProguardFiles
属性(位于库的build.gradle
文件的defaultConfig
块内)指定文件名称。例如,以下代码段会将lib-proguard-rules.txt
设为库的 ProGuard 配置文件:
android {
defaultConfig {
consumerProguardFiles 'lib-proguard-rules.txt'
}
...
}
不过,如果库模块是要编译到 APK 中的多模块构建的一部分,并且不会生成 AAR,您应该只在使用相应库的应用模块上运行代码缩减。如需详细了解 ProGuard 规则及其用法,请参阅缩减、混淆处理和优化应用。