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??:??終極形態??,集成編譯+優化+混淆三位一體