Proguard和R8有什么区别?

Rob*_*lfe 5 android proguard r8

新版本的Android Studio(3.4)刚刚发布,并带来了对R8(而非Proguard)的默认支持。有人可以解释两者之间的主要区别以及使用R8的明显好处吗?

Eli*_*yas 24

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

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

源码(的.java) --- ---的javac> Ĵ AVA字节码(的.class) --- --- Proguard的> 优化的Java字节码(的.class) --- ---地塞米松> 的Dalvik优化代码(.DEX)

然后,Android 开发人员决定将两者之间的所有步骤合并到名为 Jack&Jill 的 1 个步骤中进行优化。然而,这是在 2015 年引入并在 2017 年放弃的,因为它不够灵活,无法与所有不断增长的开发工具配合使用。

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

现在到 R8,它以 Jack&Jill 为起点具有类似的目标,将其中两个构建步骤合并为一个。Proguard 和 Dex 步骤。因此,R8 不是先处理 .class 文件,然后再返回 .class 文件和 Dex/D8 处理器接收 .class 并返回 .dex 文件,而是合并这两个步骤,并接收 .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 开发世界中有“大量”工具以某种方式对“.class”文件进行操作。而采用 J&J 方法时,这些工具都无法用于 Android 开发,这被证明是其致命错误。R8 通过在其“路径”中保留“.class”文件并允许这些工具可以挂钩来避免这种情况。 (2认同)