24

由于android studio 推出了两个新工具D8 和R8。根据谷歌文档,D8 是一个 dex 工具,R8 是一个 progourd 工具,但正如他们的解释一样,两者都在做几乎相同的事情,如下所示:

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

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

似乎两者都从字面上将java字节码转换为dex码。那么,在转换 dex 代码的情况下,他们实际上在内部做什么?

4

3 回答 3

25

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 编译器和运行时系统。

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

    增量构建将自动插入 debuggable==true 而使用“导出签名/未签名的应用程序包”不会。如果设置了 debuggable=true,那么发布版本实际上会进行调试版本。

  • 发布版本中的自动 Proguard 支持。只需要有一个proguard.config

    default.properties 中指向 proguard 配置文件的属性。

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

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

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

    • 新的缩放控件。
于 2018-04-08T03:35:30.883 回答
14

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

R8 是 D8 的一个版本,它也执行优化。它不是一个单独的工具或代码库,只是在更高级模式下运行的同一个工具。D8 首先将 Java 字节码解析为它自己的中间表示 (IR),然后写出 Dalvik 字节码,而 R8 在 IR 写出之前添加了优化传递。

于 2018-12-15T14:00:20.040 回答
2

D8 单独处理每个 Java 类文件,而不查看整个程序。这使得转换到 DEX 的速度更快,因为类可以并行处理,并且在开发过程中,当类的代码被修改时,它允许快速重新编译。

另一方面,R8(如 ProGuard)读取整个应用程序并进行需要了解整个类层次结构的更改和优化(例如内联)。例如,R8 将删除未使用的类和方法(“tree shaking”)并重命名类、方法和字段(应用程序的入口点除外)。

在 Android Studio 3.1 中,D8 已取代 DX 作为将 Java 类文件转换为 DEX 的工具,但 R8 尚未启用。

于 2018-04-07T18:56:01.507 回答