逐步采用优化方案

默认情况下,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 完整模式。请注意,混淆处理可能会使调试更加困难,因此我们建议您首先解决摇树优化问题。

如需详细了解如何取消混淆堆栈轨迹,请参阅恢复原始堆栈轨迹

限制优化范围

完全优化的构建会优化所有库和软件包中的所有代码,因此当您首次启用 R8 时,通常会遇到问题。如果您发现应用某个部分存在优化问题,请不要完全关闭 R8,否则您将失去其他所有地方的优势。相反,仅在应用中导致问题的部分暂时停用 R8。

使用软件包范围的保留规则

我们建议使用软件包范围的保留规则,作为在应用某些部分暂时停用 R8 的方法。您应该始终在以后返回来修复这些优化问题;这通常是一种解决问题区域的权宜之计。

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

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

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

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

移除软件包范围的保留规则

一旦您的应用在软件包范围的保留规则下正常运行,您应该返回并添加针对性保留规则,或移除最初需要保留规则的反射用法或库。

例如,在 AndroidX 中,保留所有扩展特定类的规则非常常见,以仅保留相关类。通常,反射应仅针对扩展某些抽象类、实现某些接口或具有特定运行时注解的类或方法。这些都是定义保留规则的受支持方式,这样您就不需要在最终完全优化的应用中使用软件包范围的保留规则。