D8和R8 Android之间的区别

31

随着安卓工作室引入了两个新工具D8和R8。

根据谷歌文档,D8是一个DEX工具,而R8是一个progourd工具,但是根据他们的解释,两者都在做以下几乎相同的事情:

D8是一个dexer,将java字节码转换为dex代码。

R8是一个Java程序缩小和最小化工具,将Java字节码转换为优化的dex代码。

从表面上看,两者都将Java字节码直接转换为dex代码。那么,实际上他们在转换dex代码方面内部到底做了什么呢?

3个回答

31

D8 dexer和R8 shrinker

D8->D8是一种将Java字节码转换为dex字节码的dexer。

R8->R8是一种Java程序缩小和最小化工具,可将Java字节码转换为优化的dex代码。

Android开发人员知道,dex编译是构建APK的关键步骤。这是将.class字节码转换为Android Runtime(或较旧版本的Android的Dalvik)的.dex字节码的过程。dex编译器在日常应用程序开发中大多在幕后运作,但它直接影响您的应用程序的构建时间、.dex文件大小和运行时性能。

R8项目使用来自Chromium项目的depot_tools管理依赖项。在继续之前,请安装depot_tools并将其添加到路径中。

R8项目使用Java 8语言特性,需要Java 8编译器和运行时系统。

  • 新的版本号方案遵循SDK工具修订号。
  • 支持真正的调试构建。无需更改Android清单中的debuggable值。

    增量构建将在使用“导出已签名/未签名应用包”时自动插入debuggable==true, 而在设置debuggable=true的情况下,发布构建实际上将进行调试构建。

  • 在发布构建中自动支持Proguard。只需要在default.properties中具有proguard.config

    指向proguard配置文件的属性即可。

  • 完全重写的可视化布局编辑器。这还是一个正在进行中的工作。

    • 对于所有布局类,从调色板到布局的完整拖放。
    • 将小部件移动到布局视图内,从一个布局视图移动到另一个布局视图,从一个布局文件移动到另一个布局文件。

    • 带有枚举/标志类型属性的上下文菜单。

    • 新的缩放控件。

19

我认为这篇博客文章的介绍是回答该问题的好资源:https://jakewharton.com/r8-optimization-staticization

R8是D8的一个版本,也可以执行优化。它不是单独的工具或代码库,而只是以更高级模式运行的相同工具。 D8首先将Java字节码解析为其自己的中间表示(IR),然后编写Dalvik字节码,R8在编写之前对IR进行优化处理。


4
D8会逐个处理Java类文件,而不是查看整个程序。这使得转换为DEX很快,因为可以并行处理类,同时在开发过程中,当类的代码被修改时,它允许快速重新编译。另一方面,R8(就像ProGuard一样)读取整个应用程序,并进行更改和优化(例如内联),这需要知道整个类层次结构。例如,R8将删除未使用的类和方法("摇树"),并重命名类、方法和字段(除了应用程序的入口点)。在Android Studio 3.1中,D8已经取代DX成为将Java类文件转换为DEX的工具,但是R8尚未启用。

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