D8和R8 Android之间的差异



Android Studio引入了两个新工具D8和R8。根据Google文档,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编译器和运行时系统。

  • 遵循SDK工具的新版本编号方案。
  • 支持真正的调试构建。无需改变可辩论的价值Android清单。

    增量构建将自动插入可访问的== true时"导出签名/未签名的应用程序包"不会。如果设置了debuggable = true,则发布构建实际上将进行调试构建。

  • 发行版中的自动渐进式支持。只需要一个proguard.config

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

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

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

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

    • 新变焦控制。

我认为此博客的介绍是回答该问题的重要资源:https://jakewharton.com/r8-optimization-staticization

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

d8分别处理每个Java类文件,而无需查看整个程序。这使得可以同时处理类的转换,因为可以并行处理类,并且在开发过程中可以在修改类的代码时快速重新编译。

另一方面,R8(如Proguard(在整个应用程序中读取,并进行更改和优化(例如,内线(,需要了解整个类层次结构。例如,R8将删除未使用的类和方法("摇晃"(和重命名类,方法和字段(应用程序的输入点除外(。

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