R8 完整模式的真正作用是什么(积极优化)?

use*_*558 5 obfuscation optimization android shrink android-r8

R8正式文件说要激活额外的优化我必须在插入此gradle.properties文件:

android.enableR8.fullMode=true
Run Code Online (Sandbox Code Playgroud)

文档说,为了使应用程序工作,我必须设置一些保留规则,但没有关于它如何工作以及它执行哪些操作的详细信息:

由于额外的优化使 R8 的行为与 ProGuard 不同,它们可能需要您包含额外的 ProGuard 规则以避免运行时问题。例如,假设您的代码通过 Java 反射 API 引用了一个类。默认情况下,R8 假定您打算在运行时检查和操作该类的对象——即使您的代码实际上没有这样做——并且它会自动保留该类及其静态初始化程序。

然而,当使用“完整模式”时,R8 不会做出这个假设,如果 R8 断言您的代码在运行时从不使用该类,它会从您的应用程序的最终 DEX 中删除该类。也就是说,如果您想保留类及其静态初始值设定项,您需要在规则文件中包含一个保留规则来做到这一点。

文档建议的常见问题解答的链接仅说明了这一点:

R8全模式

在完整模式下,R8 执行更积极的优化,这意味着可能需要额外的 ProGuard 配置规则。本节重点介绍使用完整模式时遇到的一些常见问题。

实际效果如何android.enableR8.fullMode

非常感谢!

sgj*_*sse 7

确实缺少完整模式的文档。目前主要由以下几部分组成:

  • 不要为保留<init>()的类型保留默认构造函数 ( ) 除非根本不保留任何<init>方法,在这种情况下<init>()将保留默认构造函数 ( )
  • 不要<init>()为仅用于强制转换的类型保留默认构造函数 ( ) (checkcast字节码) )
  • 不要<init>()为仅与 instanceof (instanceof字节码)一起使用的类型保留默认构造函数 ( )
  • 不要保留目标(但不是实时)默认方法的代码,使它们抽象
  • 不要在层次结构中保留所有直接方法(只保留完全匹配的方法)
  • 即使-keepattributes指定了,保留规则不匹配的类型也保留较少的属性。这目前主要针对与内/外关系(InnerClassEnclosingMethod)相关的属性。

这是主要的差异,但可能还有更多差异。我们正在努力添加更具体的文档,但这仍然是一个不断变化的目标。

请注意,如果程序的保留规则是完整的,反射使用的所有内容都包含在保留规则中,那么打开android.enableR8.fullMode应该不会导致问题。然而,我们经常看到配置,这些来自 Proguard 的(也没有记录的)约定正在使配置工作。

  • 我代表 R8 作者。 (5认同)