您可以使用 R8 和 packageScope 优化特定软件包。此功能旨在作为尚未使用 R8 的应用的可选第一步,不建议已使用 R8 的应用使用。
考虑是否使用 packageScope
如果您的应用已使用 R8,请勿使用 packageScope,因为就性能和应用大小而言,这是一种次优配置。相反,您可以通过改进的 保留规则 来增强应用的 R8 配置,或者,如果使用
兼容模式,则可以迁移到 R8 的完整模式。
尚未使用 R8 但正在采用 R8 的应用可以使用 packageScope 来逐步管理过渡。由于 R8 会应用强大的优化,这些优化可能会改变应用的行为,因此将这些优化限定在可以安全优化的特定软件包(例如 AndroidX 和 Kotlin)中,可让您以最小的风险获得性能提升。在应用稳定后,您可以逐步将这些优化扩展到代码库和依赖项的其余部分,并在每个阶段测试稳定性。
前提条件
使用 R8 和 packageScope 需要满足以下条件:
- Android Gradle 插件 9.0 或更高版本。
- 完整模式下的 R8,而不是兼容模式下的 R8。
配置优化
如需使用 packageScope 启用优化,请完成以下步骤。
选择要优化的库
确定要优化的库。我们建议您先从 AndroidX 和 Kotlin 库 androidx.**、kotlin.** 和 kotlinx.** 开始,因为这些库是已配置为与 R8 兼容的稳定库。
启用对使用 R8 和 packageScope 的支持
将以下内容添加到项目的 gradle.properties 文件中:
android.r8.gradual.support=true
设置优化块
在模块级 build.gradle.kts(或 build.gradle)文件中,将
optimization 块添加到发布 build 配置中。在此块内,使用 packageScope 列出要优化的特定软件包。在 build.gradle.kts 文件中,将软件包列表封装在 setOf() 中。
Kotlin
android {
buildTypes {
release {
optimization {
enable = true
packageScope = setOf("androidx.**","kotlin.**", "kotlinx.**")
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true
packageScope = ["androidx.**", "kotlin.**", "kotlinx.**"]
}
}
}
}
测试优化
应用或更新 packageScope 声明后,请全面 测试应用
以验证是否发生了意外崩溃或行为变更
。
从优化指定软件包过渡到优化整个应用
为了最大限度地提高优化效果,您应逐步从使用 packageScope 过渡到对整个应用使用 R8。此过程涉及逐步扩大优化范围:
- 从稳定库开始 。首先,仅在
packageScope列表中包含与 R8 优化兼容的常用稳定库。从 AndroidX 和 Kotlin 库androidx.**、kotlin.**和kotlinx.**开始。 - 逐步添加软件包 。逐步向
packageScope添加新的软件包前缀:- 评估依赖项 。查看应用的库。适合添加到
packageScope列表中的库包括 Google 官方库(例如com.google.**)和其他可靠的库,例如OkHttp(例如okhttp3.**和okio.**)。优先考虑不涉及大量反射、序列化或原生代码调用 (JNI) 的库。 - 根据软件包大小确定优先级 。使用 Android Studio 的 APK
分析器 找出导致应用大小增加的主要因素。
- 在关闭 R8 的情况下构建发布版 AAB 或 APK。
- 在分析器中打开它并检查
dex文件。 - 按大小对软件包进行排序。最大的软件包可带来最高的投资回报率 (ROI)。只要这些库没有过于宽泛的保留规则,首先针对这些库进行优化即可在流程早期大幅减小应用大小。如需了解详情,请参阅 明智地选择库。
- 评估依赖项 。查看应用的库。适合添加到
- 验证行为变更 。添加每个新的软件包前缀后,请进行 全面测试,以检测并解决任何回归或 意外行为。
- 最后添加应用软件包 。如果您的应用软件包不使用大量反射,请将应用软件包包含在
packageScope中,并根据需要逐步添加保留规则。如果您的应用软件包使用大量反射,请将软件包包含在packageScope中,并为所需的软件包添加软件包级保留规则。迭代保留规则以对其进行优化。 - 改用 R8 优化整个应用 。在
packageScope声明中包含应用的大部分依赖项且应用稳定后,移除packageScope以在完整模式下优化整个应用。