Proguard和R8有什么区别?

23

最新版的Android Studio (3.4) 刚发布,它默认支持 R8 而非 Proguard。有人能解释一下两者之间的关键差异以及使用 R8 的任何显著好处吗?


4
这是ProGuard创建者的博客文章,其中包含许多相关信息:https://www.guardsquare.com/en/blog/proguard-and-r8。这是来自Android开发者博客的一篇同样内容的文章:https://android-developers.googleblog.com/2018/11/r8-new-code-shrinker-from-google-is.html。 - Nikos Hidalgo
2个回答

42
Android构建过程的历史一直在变化,开发人员不断尝试使其更加高效,以减少构建时间和生成的.dex文件大小。因此,在整个历史中,从.java文件生成.dex文件的过程有许多变化。
在R8或D8之前,Android构建过程涉及以下四个步骤:
源代码(.java) ---javac---> Java字节码(.class) ---Proguard---> 优化后的Java字节码(.class) ---Dex---> Dalvik优化字节码(.dex)
然后,Android开发人员决定将所有中间步骤合并为1个名为Jack&Jill的步骤进行优化。然而,由于无法与所有不断增长的开发工具协作,该步骤于2015年推出并于2017年废止。
然后,引入了D8,这是回归到原始的4个步骤构建过程,并采用了优化的Dex转换。这种实现比dx产生更好的质量字节码,指令更少,寄存器分配更好。
现在来看R8,它与Jack&Jill有着相似的目标作为起点,将这两个构建步骤合并为一个。 Proguard和Dex步骤。因此,R8将这两个步骤合并,接收.class文件并返回.dex文件,而不是首先对.class文件进行Proguard处理,再返回.class文件,然后Dex/D8处理器接收.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

希望对您有所帮助,


2
非常好的回答:关于“Jack&Jill”过于死板的一个额外信息是:在Java开发世界中,有大量工具以某种方式操作.class文件。而使用J&J方法时,这些工具都无法用于Android开发,这被证明是致命的缺陷。R8通过仍然在其“路径”中拥有.class文件并允许这些工具可以连接的点来避免这种情况。 - Joachim Sauer

3

ProGuard vs R8

历史流程

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

ProGuard[关于]开源产品

R8是谷歌产品

目标:

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

R8

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接