新版本的Android Studio(3.4)刚刚发布,并带来了对R8(而非Proguard)的默认支持。有人可以解释两者之间的主要区别以及使用R8的明显好处吗?
答案 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
.class
直接转换为 .dex
(优化 .class
)