Kotlin 版本所需的 AGP、D8 和 R8 版本 :https://developer.android.google.cn/build/kotlin-support?hl=zh_cn
R8:https://developer.android.google.cn/tools/retrace?hl=zh_cn
D8:https://developer.android.google.cn/tools/d8?hl=zh_cn
如上图,这张图片是来自Google官方视频里面的。当时还没有R8,所以让DeepSeek要了一张:
- DX 编译流程(传统方案),特点:脱糖→转换→DX 编译是离散的三步,效率低且输出臃肿
- D8 编译流程(2017年推出),特点:整合脱糖到编译器内部,一步完成语法转换和 Dex 生成
- R8 编译流程(2018年推出),特点:全功能一体化引擎,一步完成脱糖+优化+混淆+压缩+Dex生成
核心能力对比
Android 编译工具演进对比:DX vs D8 vs R8
特性 | DX | D8 | R8 |
---|---|---|---|
✅ 核心功能 | .class → .dex 转换 | .class → .dex 转换 + 脱糖 | D8功能 + 混淆/压缩/优化 |
⏱️ 编译速度 | ⚠️ 慢 (需多阶段处理) | 🟢 比 DX 快 30% | 🟢 与 D8 接近 (额外优化耗时低) |
📦 输出 Dex 大小 | ⚠️ 较大 (无优化) | ⚠️ 比 DX 小约 5% | ✅ 比 D8 小 10-20% (经代码压缩) |
🔒 混淆能力 | ❌ 无 (需 ProGuard) | ❌ 无 (需 ProGuard) | ✅ 内置 (替代 ProGuard) |
🧬 脱糖支持 | ❌ 需独立工具 | ✅ 原生整合 | ✅ 原生整合 |
⚡ 代码优化 | ❌ 无 | ⚠️ 基础优化 | ✅ 高级优化 (内联/死代码删除等) |
🛠️ 维护状态 | ❌ 已弃用 (AGP 7.0+) | ✅ 基础编译 (过渡方案) | ✅ 官方推荐 (现代项目首选) |
关键差异说明
Android编译工具演进
-
DX(旧编译流程):
- 多步骤处理:
javac → 独立脱糖 → transforms → DX编译
- 脱糖是独立步骤,增加IO开销
- 无任何优化功能
- 多步骤处理:
-
D8(DX的现代化替代):
- 简化流程:
javac → transforms → D8 + 脱糖
- 关键升级:脱糖集成到编译器内部
- 编译速度比DX快30%
- Dex文件缩小5%
- 简化流程:
-
R8(D8的全功能升级):
- 单一流程:
javac → transforms → R8引擎
- 五合一功能:
- 脱糖(继承自D8)
- 深度代码优化(方法内联等)
- 混淆(取代ProGuard)
- 资源/代码压缩
- 最终dex生成
- Dex文件比D8小10 - 20%
- 构建速度比"D8 + ProGuard"快2倍
- 单一流程:
实际项目配置
在 gradle.properties 中强制启用 R8(AGP 4.0+ 默认启用):
# 显式启用 R8(AGP 7.0+ 默认)
android.enableR8 = true
# 开启全模式优化(代码压缩+混淆+优化)
minifyEnabled true
在 build.gradle 中的配置对比:
// DX时代(已过时)
android {// 无特别配置
}// D8使用方式
android {// 默认启用(AGP 3.0+)
}// R8完整配置
android {buildTypes {release {minifyEnabled true // 启用R8全功能shrinkResources true // 资源压缩proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')}}
}
总结
- DX:旧时代的过渡工具,已被彻底淘汰
- D8:编译基石,专注高效的 .class→.dex 转换
- R8:终极形态,集成编译+优化+混淆三位一体