由于android studio 推出了两个新工具D8 和R8。根据谷歌文档,D8 是一个 dex 工具,R8 是一个 progourd 工具,但正如他们的解释一样,两者都在做几乎相同的事情,如下所示:
D8是一个将java字节码转换为dex码的dexer。
R8是一个java程序收缩和缩小工具,将java字节码转换为优化的dex码。
似乎两者都从字面上将java字节码转换为dex码。那么,在转换 dex 代码的情况下,他们实际上在内部做什么?
由于android studio 推出了两个新工具D8 和R8。根据谷歌文档,D8 是一个 dex 工具,R8 是一个 progourd 工具,但正如他们的解释一样,两者都在做几乎相同的事情,如下所示:
D8是一个将java字节码转换为dex码的dexer。
R8是一个java程序收缩和缩小工具,将java字节码转换为优化的dex码。
似乎两者都从字面上将java字节码转换为dex码。那么,在转换 dex 代码的情况下,他们实际上在内部做什么?
D8 dexer 和 R8 收缩机
D8->D8 是一个将java字节码转换为dex码的dexer。
R8->R8 是一个java程序收缩和缩小工具,将java字节码转换为优化的dex码。
Android 开发者知道 dex 编译是构建 APK 的关键步骤。这是将 .class 字节码转换为 Android 运行时(或 Dalvik,对于旧版本的 Android)的 .dex 字节码的过程。dex 编译器主要在您的日常应用程序开发中工作,但它直接影响您的应用程序的构建时间、.dex 文件大小和运行时性能。
R8 项目使用 chromium 项目中的 depot_tools 来管理依赖项。在继续之前安装 depot_tools 并将其添加到您的路径中。
R8 项目使用 Java 8 语言特性,需要 Java 8 编译器和运行时系统。
支持真正的调试构建。无需更改 Android Manifest 中 debuggable 的值。
增量构建将自动插入 debuggable==true 而使用“导出签名/未签名的应用程序包”不会。如果设置了 debuggable=true,那么发布版本实际上会进行调试版本。
发布版本中的自动 Proguard 支持。只需要有一个proguard.config
default.properties 中指向 proguard 配置文件的属性。
完全重写的可视化布局编辑器。这是一项正在进行的工作。
在布局视图中移动小部件,从一个布局视图到另一个布局视图,从一个布局文件到另一个布局文件。
具有枚举/标志类型属性的上下文菜单。
我认为这篇博文的介绍是回答这个问题的一个很好的资源:https ://jakewharton.com/r8-optimization-staticization
R8 是 D8 的一个版本,它也执行优化。它不是一个单独的工具或代码库,只是在更高级模式下运行的同一个工具。D8 首先将 Java 字节码解析为它自己的中间表示 (IR),然后写出 Dalvik 字节码,而 R8 在 IR 写出之前添加了优化传递。
D8 单独处理每个 Java 类文件,而不查看整个程序。这使得转换到 DEX 的速度更快,因为类可以并行处理,并且在开发过程中,当类的代码被修改时,它允许快速重新编译。
另一方面,R8(如 ProGuard)读取整个应用程序并进行需要了解整个类层次结构的更改和优化(例如内联)。例如,R8 将删除未使用的类和方法(“tree shaking”)并重命名类、方法和字段(应用程序的入口点除外)。
在 Android Studio 3.1 中,D8 已取代 DX 作为将 Java 类文件转换为 DEX 的工具,但 R8 尚未启用。