Android中的DX、D8、R8

发布于:2025-06-15 ⋅ 阅读:(22) ⋅ 点赞:(0)

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编译工具演进

  1. DX(旧编译流程)

    • 多步骤处理:javac → 独立脱糖 → transforms → DX编译
    • 脱糖是独立步骤,增加IO开销
    • 无任何优化功能
  2. D8(DX的现代化替代)

    • 简化流程:javac → transforms → D8 + 脱糖
    • 关键升级:脱糖集成到编译器内部
    • 编译速度比DX快30%
    • Dex文件缩小5%
  3. 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​​:​​终极形态​​,集成编译+优化+混淆三位一体

网站公告

今日签到

点亮在社区的每一天
去签到