Android Proguard和R8的区别是什么?

Android Proguard和R8的区别是什么?,android,proguard,android-r8,Android,Proguard,Android R8,新版本的Android Studio(3.4)刚刚发布,它提供了对R8而不是Proguard的默认支持。有人能解释一下两者之间的主要区别以及使用R8的任何明显好处吗?Android构建过程的历史一直在变化,开发人员一直在努力提高构建时间和生成的.dex文件大小的效率。因此,纵观历史,从.java文件生成.dex文件的过程有很多变化 在R8或D8之前,Android构建过程包括以下四个步骤 源代码(.java)--javac-->java字节码(.class)--Proguard-->优化的jav

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

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

在R8或D8之前,Android构建过程包括以下四个步骤

源代码(.java)--javac-->java字节码(.class)--Proguard-->优化的java字节码(.class)--Dex-->Dalvik优化的字节码(.Dex)

然后,Android开发者决定将中间的所有步骤合并到一个名为Jack&Jill的优化步骤中。然而,这是在2015年引入的,并在2017年被放弃,因为没有足够的灵活性来处理所有不断增长的开发工具

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

现在来看R8,它以Jack&Jill为起点,有一个类似的目标,将其中两个构建步骤合并为一个。前进和前进步。因此,R8没有首先处理.class文件,而是再次返回.class文件和Dex/D8处理器接收.class和返回.Dex文件,而是合并这两个步骤,接收.class文件,返回.Dex文件。该工具仍在不断改进,试图进一步优化构建过程。因此,现在将项目迁移到R8是明智的,因为它是一个仍在增长的工具,很快将成为默认的构建工具。(可以在Android Studio(3.4)的升级中默认启用)

此外,Google issue tracker中的开发人员非常快地返回到关于R8的问题报告中,因为他们渴望得到反馈,并希望完善这个工具

据报道,使用R8可以生成更小的.dex文件,并且可以更有效地缩小删除未使用的类的规模。这在某种程度上是一个加号和一个减号。这显然是一个加号,因为更小的大小总是更好的(在编程中!),它是一个减号,因为您必须复杂地检查代码,并检测您的入口点,并相应地重新实现proguard文件中的保留规则,因为R8引入了比proguard更积极的缩小

有关更多信息,您可以阅读本文,其中包括关于R8与Proguard的非常详细的解释:

此外,Google I/O 2018的官方演讲:

希望这有帮助,

历史流

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

R8是一个

目标:

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

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

这是proguard创作者的一篇博文,其中包含大量相关信息:android开发者博客taht中的一篇博文也是这样做的:非常好的回答:关于“Jack&Jill”的额外信息过于死板:事实证明,Java开发世界中有大量工具以某种方式操作
.class
文件。在强生的方法下,这些工具都不能用于Android开发,这是它致命的错误。R8通过在其“路径”中仍然有
.class
文件并允许这些工具可以挂接的点来避免这种情况。