R8完全模式到底有什么作用(积极的优化)?

R8 official documentation说,要激活其他优化,必须将其插入gradle.properties文件中:

android.enableR8.fullMode=true

文档说,要使该应用程序正常运行,我必须设置一些保留规则,但没有有关其工作方式和执行哪些操作的详细信息:

  

因为其他优化使R8的行为与   ProGuard,他们可能会要求您包括其他ProGuard规则以   避免运行时问题。例如,假设您的代码引用了   通过Java Reflection API类。默认情况下,R8假定您   打算在运行时检查和操作该类的对象,甚至   如果您的代码实际上不这样做,它会自动保留该类并   其静态初始值设定项。

     

但是,在使用“完整模式”时,R8不会做出此假设,并且   如果R8断言您的代码否则将永远不会使用   运行时,它将从您应用的最终DEX中删除该类。也就是说,如果   您想要保留该类及其静态初始值设定项,您需要   在您的规则文件中加入一个保留规则即可。

文档建议的常见问题解答中的link仅表示以下内容:

  

R8完整模式

     

在完整模式下,R8表现出更具侵略性   优化,意味着附加的ProGuard配置规则   可能是必需的。本节重点介绍了一些常见问题   在使用完整模式时可以看到。

android.enableR8.fullMode真正如何工作?

非常感谢!

Doris9900 回答:R8完全模式到底有什么作用(积极的优化)?

确实缺少完整模式的文档。现在,它主要包括以下内容:

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

这是主要区别,但可能还有更多区别。我们正在努力添加更多具体的文档,但这仍然是一个移动的目标。

注意,如果程序的保持规则完整,并且反射所使用的所有内容都被保持规则覆盖,则打开android.enableR8.fullMode不会引起问题。但是,我们经常看到配置,其中Proguard的这些(也未记录)约定使配置生效。

本文链接:https://www.f2er.com/3153653.html

大家都在问