脱糖Sugar发展史及ProGurard R8区别

466 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

由于Android是使用的基于寄存器的指令集运行,而JVM是基于栈。因此一些Java高版本的语法特性不能在Android上使用。因此为了在Android基于寄存器的指令集也可以使用基于栈的指令集的一些语法特性,谷歌开发了TransformationIa,新增的这个编译过程用来脱糖:

脱糖的发展史:

  1. 编译流程繁琐,提出Jack&Jill编译器,减少中间环节,直接从源代码一步生成dex文件
  2. 省去中间环节,意味着无法在中间特定环节中加入处理过程,因此Jack和Jill编译器被废弃,回归到原始的编译流程,只不过对于原始class转换Dex步骤由原来的DX变为了D8

原始流程是先经过拖堂在做混淆,在D8上是先经过混淆在做脱糖(脱糖过程被内置在了class转换dex的过程中)

  1. D8和混淆的过程被R8整合了,因此编译为class之后执行R8就可完成之前的混淆和转换dex工作。

ProGurard R8区别

R8 的对 .dex 最大的优化就是它只保留了我们指定支持的设备所能理解的 opcodes,就像下图所示的那样。【这里说的是在某些设备上某些指令会导致崩溃,看起来是会做一些处理】

  • ProGuard → 压缩、优化和混淆Java字节码文件的免费工具,开源仓库地址:proguard
  • R8 → ProGuard的替代工具,支持现有ProGuard规则,更快更强AGP 3.4.0或更高版本,默认使用R8混淆编译器。

对于编译步骤的影响

Proguard 也是编译过程中一个 transformation 的步骤,当然也会影响编译时间。为了解决这个问题,R8 在 dex 过程中也会做类似的事情(比如优化、混淆、清理无用的类),而避免了多一步 transformation.

处理混淆本身也是一个transform的过程,而拖堂D8也是transform的过程、R8整合了这两个变成了一个transform