Proguard和R8有什么区别?

时间:2019-04-18 10:50:45

标签: android proguard r8

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

2 个答案:

答案 0 :(得分:2)

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

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

SourceCode(.java) --- javac ---> J ava Bytecode(.class) --- Proguard ---> 优化的Java字节码(.class) --- Dex ---> Dalvik优化的字节码(.dex)

然后,Android开发人员决定将这两个步骤之间的所有步骤合并到一个称为Jack&Jill的步骤中,以进行优化。但是,该方法于2015年推出,由于不够灵活,无法与所有不断增长的开发工具一起使用而在2017年被放弃。

然后,引入了D8,它通过优化的Dex变换恢复到原始的4步构建过程。与dx相比,该实现产生了更好的字节码质量,具有更少的指令和更好的寄存器分配。

现在到R8,它的目标与Jack&Jill类似,将其中的两个构建步骤合并为一个。 Proguard和Dex步骤。因此,R8不会合并Proguard再处理.class文件并再次返回.class文件,而Dex / D8处理器将.class文件并返回.dex文件,而是将这两个步骤合并,并接收.class文件,返回.dex文件。该工具仍在不断完善,试图进一步优化构建过程。因此,现在将您的项目迁移到R8是很明智的,因为它仍在增长,它将很快成为默认的构建工具。 (正如在Android Studio(3.4)的升级中默认启用所示)

此外,由于他们渴望获得反馈并希望完善此工具,因此Google问题跟踪工具中的开发人员可以很快地返回有关R8的报告问题。

据报道,使用R8可以生成较小的.dex文件,并且可以更有效地消除未使用的类。在某种程度上,这是一个正负。显然,这是一个加号,因为较小的大小总是更好(在编程中!),这是个减号,因为您必须复杂地遍历代码,并检测入口点并相应地在proguard文件中重新实现keep规则,如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

希望这会有所帮助,

答案 1 :(得分:0)

历史流程

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