Proguard和R8有啥区别?

Posted

技术标签:

【中文标题】Proguard和R8有啥区别?【英文标题】:What is the difference between Proguard and R8?Proguard和R8有什么区别? 【发布时间】:2019-09-08 16:47:21 【问题描述】:

新版本的 android Studio (3.4) 刚刚发布,默认支持 R8 而不是 Proguard。有人能解释一下两者之间的主要区别以及使用 R8 的任何明显好处吗?

【问题讨论】:

这是一篇来自 proguard 的创建者的博文,其中包含很多相关信息:guardsquare.com/en/blog/proguard-and-r8 和来自 android 开发者博客的一篇同样的文章:android-developers.googleblog.com/2018/11/… 【参考方案1】:

Android 构建过程的历史不断变化,开发人员不断尝试使其在构建时间和生成的 .dex 文件大小方面更加高效。因此,纵观历史,从 .java 文件生成 .dex 文件的过程有很多变化。

在 R8 或 D8 之前,Android 构建过程涉及这四个步骤;

SourceCode(.java) ---javac---> Java Bytecode(.class) --- Proguard---> 优化的 Java 字节码(.class) ---Dex---> Dalvik 优化的字节码(.dex) em>

然后,Android 开发人员决定将中间的所有步骤合并为一个称为 Jack&Jill 的步骤以进行优化。但是,由于不够灵活,无法与所有不断发展的开发工具配合使用,它于 2015 年推出并于 2017 年被放弃。

然后,引入了 D8,这是一个恢复到原始的 4 步构建过程,并具有优化的 Dex 转换。这种实现产生的字节码质量比 dx 更好,指令更少,寄存器分配更好。

现在到 R8,它的目标与 Jack&Jill 相似,作为起点,将其中两个构建步骤合并为一个。 Proguard 和 Dex 步骤。因此,不是先 Proguard 处理 .class 文件再返回 .class 文件,Dex/D8 处理器接收 .class 并返回 .dex 文件,R8 合并这两个步骤,并接收 .class 文件,返回 .dex 文件。这个工具还在变得越来越好,试图进一步优化构建过程。因此,现在将您的项目迁移到 R8 是明智的,因为它是一个仍在增长的工具,很快将成为默认的构建工具。 (在Android Studio(3.4)升级中默认开启可见)

此外,Google 问题跟踪器中的开发人员非常快速地返回报告的有关 R8 的问题,因为他们渴望获得反馈并希望完善此工具。

据报道,使用 R8 会生成更小的 .dex 文件,并且可以更有效地缩小未使用的类。在某种程度上,这是一个优点和一个缺点。这显然是一个加号,因为较小的尺寸总是更好(在编程中!),这是一个减号,因为您必须复杂地检查您的代码,并检测您的入口点并相应地重新实现您的 proguard 文件中的保留规则,正如 R8 介绍的那样比 Proguard 更激进的缩小。

有关更多信息,您可以查看这篇文章,其中包含关于 R8 与 Proguard 的非常详细的解释:https://www.guardsquare.com/en/blog/proguard-and-r8

另外,来自 Google I/O 2018 的官方演讲:https://www.youtube.com/watch?v=x9T5EYE-QWQ&t=1194s

希望对你有帮助,

【讨论】:

很好的答案:关于“Jack & Jill”的附加信息太不灵活了:事实证明,Java 开发世界中有 的工具在 @987654323 上运行@ 文件以某种方式。而采用强生的方法,这些工具都不能用于 Android 开发,结果证明这是它的致命错误。 R8 通过在其“路径”中仍然有 .class 文件并允许这些工具可以挂接的点来避免这种情况。【参考方案2】:

历史流程

ProGuard -> R8
// R8 is default optimizer of .class files from Android Studio v3.4 

ProGuard 是open source product

R8 是Google product

目标:

缩小,缩小 优化 混淆、重命名

R8

R8 具有更好的性能,因为无需额外步骤即可将.class 直接转换为.dex(优化.class) R8 与 Kotlin 的兼容性更好

【讨论】:

以上是关于Proguard和R8有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

同时使用 ProGuard 和 R8

R8 和 Proguard 规则

ProGuard 中的 -keep 和 -keepclassmembers 有啥区别?

Android/Java 混淆:R8 与(ProGuard 或 DexGuard)?

保留规则的 Proguard/R8 例外

Proguard 和 R8 没有优化我的库代码