Proguard 和 R8 有什么区别?

What is the difference between Proguard and R8?

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

Android 构建过程的历史一直在变化,开发人员一直在努力提高构建时间和生成的 .dex 文件大小方面的效率。因此,纵观历史,从 .java 文件生成 .dex 文件的过程有很多变化。

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

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

然后,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 是明智的,因为它是一个仍在不断发展的工具,很快就会成为默认的构建工具。 (可以看出在AndroidStudio(3.4)的升级中默认启用)

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

据报道,使用 R8 会生成更小的 .dex 文件,并且可以更有效地缩小未使用的 classes。这在某种程度上是一个加号和一个减号。它显然是一个加号,因为较小的尺寸总是更好(在编程中!),它是一个减号,因为你必须复杂地检查你的代码,并检测你的入口点并相应地在你的混淆文件中重新实现保留规则,正如 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

希望对您有所帮助,

历史流

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 的兼容性更好