D8和R8安卓的区别

Posted

技术标签:

【中文标题】D8和R8安卓的区别【英文标题】:Difference between D8 and R8 android 【发布时间】:2018-09-08 00:07:42 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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 工具修订号的新版本号方案。

支持真正的调试构建。无需更改 debuggable 的值 Android 清单。

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

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

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

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

为所有布局类从调色板完全拖放到布局。

在布局视图内移动小部件,从一个布局视图到另一个布局视图,从一个布局文件到另一个布局文件。

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

新的缩放控件。

【讨论】:

【参考方案2】:

我认为这篇博文的介绍是回答这个问题的一个很好的资源:@​​987654321@

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于D8和R8安卓的区别的主要内容,如果未能解决你的问题,请参考以下文章

Android编译优化:D8和R8

Android编译优化:D8和R8

Proguard和R8有啥区别?

Android CPU, Compilers, D8 & R8

Android CPU, Compilers, D8 & R8

ARM指令和THUMB指令有啥区别