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