当前位置: 首页 > news >正文

Android中的DX、D8、R8

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

特性DXD8R8
✅ 核心功能.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​​:​​终极形态​​,集成编译+优化+混淆三位一体

相关文章:

  • Android多渠道打包
  • 【STM32的通用定时器CR1的CKD[1:0]: 时钟分频因子 (Clock division)】
  • 造轮子系列:从0到1打造生产级HTTP客户端,优雅封装OkHttp/HttpClient,支持异步、重试与文件操作
  • LSM树与B+树优缺点分析
  • LeetCode 209.长度最小的子数组
  • 多线程中SimpleDateFormat为何不安全?如何解决?
  • 基于大模型预测过敏性紫癜的技术方案大纲
  • window 显示驱动开发-DirectX VA 2.0 的扩展支持
  • Python 爬虫入门 Day 2 - HTML解析入门(使用 BeautifulSoup)
  • 【工具教程】批量PDF识别提取区域的内容重命名,将PDF指定区域位置的内容提取出来改名的具体操作步骤
  • Logback-spring.xml 配置屏蔽特定路径的日志
  • 美化显示MSVC调试的数据结构
  • centos 8.3(阿里云服务器)mariadb由系统自带版本(10.3)升级到10.6
  • 实现无缝连接:EtherNet/IP转CANopen网关助力汽车制造智能化未来
  • 【Twisted】Python 使用Twisted实现TCP多人聊天Demo
  • 从Apache OFBiz 17.12.01的反序列化漏洞到Docker逃逸的渗透之红队思路
  • 探索Agent的发展潜力:大模型与具身智能的融合
  • 序列化问题和网络字节序
  • 【评测】Qwen3-Embedding与nomic-embed-text的召回效果对比
  • ROS 2安装 slam_toolbox
  • 真实的做视频网站/semester
  • 青岛个人网站制作/友情链接怎么弄
  • 小程序代理运营/seo关键词优化排名
  • 高端网站建设 骆诗/中国十大网络销售公司
  • 网站建设优化服务精英/百度竞价员
  • wordpress备份网站/软文推广发布平台