新版本的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,这是使用优化的Dex变换还原为原始的4步构建过程。与dx相比,此实现产生了质量更好的字节码,具有更少的指令和更好的寄存器分配。

现在到R8,它的目标与Jack&Jill相似,将其中两个构建步骤合并为一个。 Proguard和Dex步骤。因此,R8合并了这两步,并接收了.class文件,返回了.dex文件,而不是先由Proguard处理.class文件再返回.class文件和Dex/D8处理器接收.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

希望这可以帮助,

关于android - Proguard和R8有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55744477/

10-09 01:35