android - R8 完整模式的真正作用是什么(积极优化)?
问题描述
R8 官方文档说要激活额外的优化,我必须在文件中插入这个gradle.properties
:
android.enableR8.fullMode=true
文档说,为了使应用程序工作,我必须设置一些保留规则,但没有关于它如何工作以及它执行什么操作的详细信息:
由于额外的优化使 R8 的行为与 ProGuard 不同,它们可能需要您包含额外的 ProGuard 规则以避免运行时问题。例如,假设您的代码通过 Java 反射 API 引用了一个类。默认情况下,R8 假定您打算在运行时检查和操作该类的对象(即使您的代码实际上不这样做),它会自动保留该类及其静态初始化程序。
但是,当使用“完整模式”时,R8 不会做出此假设,并且如果 R8 断言您的代码在运行时不会使用该类,它会从您的应用程序的最终 DEX 中删除该类。也就是说,如果要保留类及其静态初始化程序,则需要在规则文件中包含一个保留规则来执行此操作。
文档建议的常见问题解答的链接仅说明了这一点:
R8全模式
在完整模式下,R8 执行更积极的优化,这意味着可能需要额外的 ProGuard 配置规则。本节重点介绍使用完整模式时出现的一些常见问题。
android.enableR8.fullMode
真正如何运作?
非常感谢!
解决方案
R8 FAQ中描述了完整模式和兼容模式之间的区别。
请注意,如果程序的保留规则是完整的,即反射使用的所有内容都被保留规则覆盖,那么打开android.enableR8.fullMode
不应导致问题。但是,我们经常看到配置,Proguard 的这些(也未记录)约定使配置工作。
推荐阅读
- c# - System.IO.IOException:'该进程无法访问文件“文件位置”,因为它正在被另一个进程使用。'
- mongodb - 事务花费太多时间(Node + Meteor + MongoDB)
- firebase - 如何从查询中的 DocumentID 列表中返回 Firestore 文档?
- python - 是否有代码对列中包含的相似单词进行分组
- microsoft-graph-api - Microsoft Graph OneDrive API 在上传文件时返回 504 网关超时
- postgresql - 如何在此查询 postgresql 中获取 var cast 的值?
- php - 自动完成返回“0 个结果”
- string - 为什么翻译工作而不是 sed 换行
- sql-server - DELETE-OUTPUT-INTO 性能
- azure - 将服务主体客户端 ID 和机密传递给 ARM 模板