16

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

4

2 回答 2

31

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

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

SourceCode(.java) ---javac---> Java Bytecode (.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 是明智的,因为它是一个仍在增长的工具,很快将成为默认的构建工具。(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

希望这可以帮助,

于 2019-10-31T09:53:35.743 回答
1

历史流程

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

ProGuard 是开源产品

R8 是谷歌产品

目标:

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

R8

  • R8 具有更好的性能,因为.class直接转换为.dex无需额外步骤(优化.class
  • R8 对 Kotlin 有更好的兼容性
于 2021-01-19T17:06:28.070 回答