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​​:​​终极形态​​,集成编译+优化+混淆三位一体

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通义灵码 AI IDE 上线!智能体+MCP 从手动调用工具过渡到“AI 主动调度资源”

告诉大家一个好消息,通义灵码发布了 AI 编程 IDE :Lingma IDE ,你没看错,通义灵码也推出了自己的 AI IDE 客户端,不是 AI 编程插件,是 IDE 。 Lingma IDE 是基于 VS Code 开源版本构建的智能代码编辑器&am…

快速解决软件测试的逻辑方法运用

在软件测试过程中,遇到复杂问题时,如何快速定位和解决?关键在于运用逻辑方法,系统化地分析问题、设计测试用例、优化测试流程。本文将介绍几种高效的逻辑方法,帮助测试工程师提升效率,减少盲测和重复劳动。…

枫清科技携手中化信息挖掘实现AI高价值场景应用,打通智能化“最后一公里”

近日,中国中化控股有限责任公司(以下简称“中国中化”)发布“人工智能”专项行动推进方案,标志着其全面深化人工智能战略布局、全力支撑“数智中化”建设进入加速落地阶段。作为集团智能化转型的核心支撑单位,中国中化…

Yolov5.6增加注意力机制+ByterTrack:目标检测与跟踪

简介:本项目使用ESP32-CAM采集图像上传至上位机进行手部目标检测与追踪,使用了YOLOv5.6(注意力机制ECA,CBAM)ByteTrack 博主同款迅雷链接: 链接:https://pan.xunlei.com/s/VOSO1EIzmXhBb_BIKM58cM5cA1# 提…

C++进阶—C++中的继承

第一章:继承的概念及定义 1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向…

力扣Hot100每日N题(11~14)

200. 岛屿数量 BFS或DFS class Solution {private int[] dx {0, 0, 1, -1};private int[] dy {1, -1, 0, 0};int ans 0, n, m;void dfs(char[][] grid, int x, int y){if(x < 0 || y < 0 || x > n || y > m || grid[x][y] 0) return;grid[x][y] 0;for(int i…

人工智能 倒底是 智能 还是 智障?

假设有如下哈希运算的过程和结果&#xff0c;然后让人工智能根据初始条件和最终结果的最后几个字符推理出中间过程。 yw "123456" salt "a1b2c3d4e5f6" sda256(saltsha1(md5(yw.encode)salt)) 1c5852fa5d3c450621c17b9ba87ffdab8d336b16f015b4a10cffc945…

传智健康---十天项目总结

第一天&#xff1a; 基本内容如下&#xff1a; 从gitee拉取对应的基础代码。做好配置相关工作。测试页面是否可以正常打开。 无问题 需要学习的内容&#xff1a;spring security 了解到这个框架的基础作用大概是&#xff1a;管理请求路径&#xff0c;管理用户权限&#xf…

AbMole| Angiotensin II human(M6240;血管紧张素Ⅱ)

Angiotensin II&#xff08;血管紧张素II&#xff09;是一种生物活性肽和血管收缩剂。Angiotensin II作为肾素-血管紧张素-醛固酮系统&#xff08;RAAS&#xff09;的关键活性成分&#xff0c;在动物模型中&#xff0c;它通过调节于血管平滑肌细胞上的血管紧张素II受体&#xf…

【C/C++】gmock vs mockcpp

文章目录 gmock vs mockcpp1 基本介绍2 语法风格与使用方式gmock 特点&#xff08;基于接口 Mock&#xff09;&#xff1a;mockcpp 特点&#xff08;基于重写/拦截原函数&#xff09;&#xff1a; 3 对比总结4 实际使用建议 gmock vs mockcpp gmock 和 mockcpp 是 C 中常用的两…

自己的服务器被 DDOS跟CC攻击了怎么处理,如何抵御攻击?

今天后台突然弹出警报&#xff1a;服务器带宽瞬间跑满&#xff0c;CPU 占用率飙到 100%。刷新页面时&#xff0c;首页加载像卡带般断断续续&#xff0c;图片刚显示半张就卡住&#xff0c;点击任何按钮都没反应。登录服务器一看&#xff0c;访问日志里密密麻麻全是陌生 IP 的高频…

icg真的只能用latch不能用Flip-flop吗

soc设计中常用latch来做时钟门控&#xff0c;它的rtl描述如下&#xff1a; input EN; input clk; input TE; output E_clk;always (*) beginif (clk1d0)E_latch EN | TE; endassign E_clk E_latch & clk;实际soc实现会把上面代码中latch和与操作换成专用CLKLANQ的libcel…

基于python大数据的nba球员可视化分析系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

从0开始学习R语言--Day22--km曲线

KM曲线 在分析疾病的死亡率时&#xff0c;我们往往会纠结于怎样在逻辑架构中去考虑未死亡的人群&#xff0c;以及想研究两种药物的表现效果&#xff0c;但病人的指标表现都不明显&#xff0c;作用于其他指标且很难量化。 而KM曲线可以很好地反映人群在时间序列上的生存率&…

SpringBoot ​@ControllerAdvice 处理异常

应用中的异常&#xff0c;有两件事要考虑&#xff0c;怎么处理这个异常&#xff0c;怎么把异常可读性高地返回给前端用户 1.怎么把异常可读性高的返回给前端用户或API的消费者 自定义错误代码和错误内容 2.怎么处理异常 比如遇到某个异常时需要发邮件通知IT团队 Controlle…

爬百度图片如何解决{“antiFlag“:1,“message“:“Forbid spider access“}

在学习深度学习的卷积神经算法时&#xff0c;需要猫和狗的训练数据集。这时想到在百度网上爬取猫和狗的图片。 在爬取狗狗图片的时候&#xff0c;我抓包分析了下获取这个url1 “https://image.baidu.com/search/index?tnbaiduimage&ipnr&ct201326592&cl2&lm&…

QWebEngine

Qt自带的QWebEngine 不支持播放MP4, 需要手动编译QWebEngine模块 不支持播放mp4 // mainwindow.cpp , m_webEngine(new MyWebEngine(this)) void MainWindow::init() { //关闭系统代理&#xff0c;提高速度,采用release会更快QNetworkProxyFactory::setUseSystemConfigurati…

Rust 学习笔记1

Basic基础 actix_web基础 #[get("/favicon")] 获取静态图片 #[get("/welcome")] 简单的欢迎 #`/user/{name}/` basic.rs源码 源码 use std::{convert::Infallible, io};use actix_files::{Files, NamedFile}; use actix_session::{storage::Cooki…

3GPP协议PDF下载

https://www.tech-invite.com/3m38/tinv-3gpp-38.html 可以进入3GPP官网界面&#xff0c;也可以进入PDF下载界面 PDF加载比较慢

高性能服务器程序框架知识梳理

服务器编程框架 服务器程序种类有很多&#xff0c;但是基本框架都一样&#xff0c;核心不同点在于逻辑处理单元。基本框架包含&#xff1a;I/O处理单元、逻辑单元、网络存储单元以及请求队列。 I/O处理单元&#xff08;主线程&#xff09;&#xff1a;服务器用来管理客户连接…