逐步采用优化措施

默认情况下,R8 会进行大量优化以提升性能和缩减大小,但这些优化可能不会立即对您的应用生效。如果您是首次在大型应用中启用 R8(或启用 完整模式),请尝试 逐步采用优化:暂时关闭混淆,并 一次为部分代码启用 R8,而不是为应用中的所有代码启用 R8。我们建议在本地开发期间采用这种增量方法,但 您也可以在内部质量保证测试期间,甚至在生产环境中,以 渐进式发布的方式使用此方法。您采取的具体步骤取决于您期望的时间表以及对预发布测试覆盖率的信心。

限制优化

R8 会进行多种类型的优化,包括移除代码、重写代码和移除资源。以下是优化类型的一些高级说明:

  • 代码缩减(或摇树优化):移除未被引用的代码
  • 混淆(或标识符压缩):缩短类和方法的名称
  • 优化:重写代码,例如内联

为了减少出错的可能性,您可以先仅启用部分优化。

仅启用摇树优化

代码缩减(也称为摇树优化)会移除看似未被引用的代码。我们建议您先从摇树优化开始,因为它是最直接的。

如需仅启用摇树优化,请将以下内容添加到 proguard-rules.pro 文件中,以关闭其他类型的优化。关闭混淆至关重要,因为它可以让堆栈轨迹更易于阅读。

-dontobfuscate // Use temporarily to turn off identifier minification
-dontoptimize // Use temporarily to turn off optimization

最后,您可能不希望发布此配置,因为它会大幅限制 R8 优化代码的能力,但对于首次在需要修复问题的大型代码库中采用 R8 来说,这是一个很好的起点。

使用兼容模式

默认情况下,R8 以 完整模式 运行。完整模式可以显著提升性能并节省大小,但您可以在首次启用压缩时暂时停用它,并改用兼容模式。

如需使用兼容模式,请在 gradle.properties 文件中使用以下设置:

android.enableR8.fullMode = false // Use temporarily to disable full mode

启用其余优化

确认摇树优化适用于您的应用后,您可以移除之前的设置,以重新启用混淆、优化和 R8 完整模式。 请注意,混淆可能会使调试更加困难,因此我们建议您先解决摇树优化问题。

如需详细了解如何对堆栈轨迹进行去混淆处理,请参阅 恢复原始堆栈轨迹。

限制优化范围

完全优化的 build 会优化每个库和软件包中的所有代码,因此您首次启用 R8 时,通常会遇到问题。如果您发现应用的一部分存在优化问题,请不要完全关闭 R8,否则您将无法在其他任何地方获得好处。相反,请仅在导致问题的应用部分中暂时停用 R8。

使用软件包级保留规则

我们建议使用软件包级保留规则,以便在应用的部分中暂时停用 R8。您应始终稍后回来修复这些优化问题;这通常是一种临时解决方案,用于解决问题区域。

例如,如果应用的一部分大量使用 Gson 并导致 优化问题,理想的解决方案是添加更 具针对性的保留规则或改用代码生成解决方案。但是,为了解除对应用其余部分进行优化的限制,您可以将定义 Gson 类型的代码放在专用子软件包中,并将如下规则添加到 proguard-rules.pro 文件中:

-keep class com.myapp.json.** { *; }

如果您使用的某些库对内部 组件进行了反射,您可以类似地为整个库添加保留规则。您需要检查库的代码或 JAR/AAR,以找到要保留的相应软件包。同样,不建议长期维护此规则,但它可以解除对应用其余部分进行优化的限制:

-keep class com.somelibrary.** { *; }

移除软件包级保留规则

在应用使用软件包级保留规则正常运行后,您应返回 并添加有针对性的保留规则,或移除 反射用法或库,这首先需要保留规则。

例如,在 AndroidX 中,保留扩展特定类的所有规则非常常见,以便仅保留相关类。一般来说,反射应仅以扩展特定抽象类、实现特定接口或具有特定运行时注解的类为目标。这些都是定义保留规则的受支持方式,因此您无需在最终的完全优化的应用中使用软件包级保留规则。

如果您的代码库中存在反射,您可以将软件包级 保留规则替换为 Jetpack Keep。生成的规则是有条件的:R8 仅在保留发出调用的代码时,才会保留反射调用的目标。如需迁移软件包,请使用 Jetpack Keep lint 检查 来 查找并注解其反射调用,然后移除软件包级规则。