Android ART dex2oat
一、什么是dex2oat
Dex2oat (dalvik excutable file to optimized art file) ,是一个对 dex 文件进行编译优化的程序,在我们的 Android 手机中的位置是 /system/bin/dex2oat,对应的源码路径为 android/art/dex2oat/dex2oat.cc,通过编译优化,可以提升用户日常的使用体验(包含安装速度、启动速度、应用使用过程中的流畅度等),是 Android Art Runtime 中的一个重要的模块, 本文我们一起来了解下 dex2oat 的功能以及常用的场景。
二、为什么要进行dex2oat转换?
众所周知, Android 虚拟机可以识别的是dex文件,应用使用过程中如果每次将dex文件加载进行内存,解释性执行字节码,效率会很低, 严重影响用户体验。通过dex2oat 优化后, 可以在系统运行之前利用合适的时机将dex文件字节码提前转化为虚拟机可以执行运行的机器码,后续直接从效率更高的机器码中运行,则运行阶段更加流畅,优化用户体验。
Dex2oat的主要触发场景
三、几种dex2oat 相关的文件
Dex文件:Dex文件是Android 虚拟机识别的一种可执行文件,我们可以解压一个apk, 获取其中的class.dex文件, 通过dexdump 命令工具对dex 文件进行解析,查看文件内容,更多格式说明查看参考资料 1。
Oat文件:art执行的文件,dex2oat程序编译dex文件的产物。我们可以通过oatdump 查看oat文件具体内容。
Odex文件: Optimizied dexfile, dex文件已经dexopt操作优化后的产物,和dex文件类似,使用了一些优化操作码。
Art文件:Image文件,记录应用启动热点函数相关地址,方便寻址。
Vdex文件:Verified dex,主要包含dex和quicken info信息。Andorid 8.0新增机制产生的文件,其目的主要是为了跳过verified流程,减少dex2oat执行时间。
四、如何使用Dex2oat
4.1 Dex2oat用法
Dex2oat工具的常用参数如下:
4.2 Dex2oat日志解析
从日志中可以看出,在dex2oat发起时具体的编译类型、线程数以及编译原因等等。
常见的编译类型:verify、quicken、space-profile、space、speed-profile、speed、everything, 具体效果从字面上比较好理解, 越后面的类型编译时间越长,占用的空间也越大,运行时打开速度也越快,典型空间换时间思路的体现,其中profile类型的编译方式主要是根据JIT运行过程中热点函数的情况进行编译,JIT机制不进行展开,可以查阅相关资料。
4.3 和dex2oat相关的系统配置
[pm.dexopt.ab-ota]: [speed-profile]
[pm.dexopt.bg-dexopt]: [speed-profile]
[pm.dexopt.boot]: [verify]
[pm.dexopt.first-boot]: [quicken]
[pm.dexopt.inactive]: [verify]
[pm.dexopt.install]: [speed-profile]
[pm.dexopt.shared]: [speed]
4.4 如何手动发起dex2oat操作
通过以上介绍参数含义后,我们可以在adb shell 下通过命令行方式直接发起dex2oat操作,例如强制编译微信:
adb shell cmd package compile -m speed-profile -f com.tencent.mm
清除配置文件数据并移除经过编译的代码:
adb shell cmd package compile --reset com.tencent.mm
下面对具体调用的流程进行分析。
五、Dex2oat 流程分析
本次分析基于Android Q 代码。上述触发场景主要涉及PackageManagerService , 所以从该服务作为入口,分析dex2oat的相关流程。
应用在发起dex2oat时,主要通过PMS中接口调用installd触发的,相关调用函数performDexOpt ,该函数在上述应用安装以及启动的时候都会涉及,所以主要查看下这个函数的调用流程,详见代码:
传入参数DexoptOptions , 可以通过该参数指定编译包名,编译类型以及标志,返回编译是否成功。常见编译标志位:
接下来的调用流程:
以上是Framework中Dex2oat 的调用流程, 感兴趣的同学可以跟踪代码查看具体细节。
系统经过installd 的dexopt编译,通常会利用一些关键的日志查看dex2oat相关的信息, 比如计算dex2oat运行耗时以及最终的编译状态。
Installd dexopt代码小结:
1.检测dexopt classloader context 和相关的flag。
2.解析传入参数,生成dex2oat 命令, 最后通过RunDex2Oat 执行。
常见的dalvik参数控制属性值,
经过上述命令,最终调用到底层libart中相关代码,下面我们查看dex2oat调用的流程图, 了解dex2oat的相关流程。
流程图
Dex2oat逻辑小结:
1. 处理命令行参数;
2. 判断dex2oat的setup是否完成;
3. 根据是否为image类型,分别调用CompileImage或CompileApp的处理,CompileImage和CompileApp的主要功能逻辑类似,主要通过CompilerDriver对dexfile 进行编译。
六、Dex2oat常见修改思路
前面介绍了dex2oat一些优化以及相关的流程,虽然能够提高系统的流畅度,如果在不合适的时机发起,很有可能影响到其他用户操作,需要针对这一类情况进行修改。
以下是常见的修改思路:
1. 根据场景和负载情况调整dex2oat 编译参数,如编译类型,编译线程数量等。
2. 调整boot.img编译资源,预加载资源文件列表。
3. 后台并行编译。在系统空闲或者首次加载dex文件的时候预先触发dex2oat流程,从而加快后续使用dex文件的速度。
举例:后台应用安装导致大量资源被dex2oat占用导致前台进程卡顿
dex2oat 优化后虽然能够增加应用运行的流畅度, 但是如果在短时间内大量发起则会影响用户界面操作, 造成负面的影响。所以发现应用是因为后台自动更新时, 则可以限制dex2oat运行的线程数量,尽可能的减少对前面进程的影响。
七、总结
本文从dex2oat日志输出和使用命令出发,介绍了dex2oat常用的场景以及相关的调用流程,以此为根据简单讨论了常见dex2oat优化方面的思路,希望能起到抛砖引玉的作用,加深读者对dex2oat的原理流程的了解。
参考资料
1.https://source.android.google.cn/devices/tech/dalvik/dex-format
2.https://source.android.com/devices/tech/dalvik/configure#runtime_configuration
3.https://source.android.com/devices/tech/dalvik
4.https://blog.csdn.net/cosmoslhf/article/details/40380559
相关文章:

Android ART dex2oat
一、什么是dex2oat Dex2oat (dalvik excutable file to optimized art file) ,是一个对 dex 文件进行编译优化的程序,在我们的 Android 手机中的位置是 /system/bin/dex2oat,对应的源码路径为 android/art/dex2oat/dex2oat.cc,通…...

「RISC-V Arch」RISC-V 规范结构
日期:20230228 规范分类 根据 RISC-V 设计哲学,其规范文档也是高度模块化的: ISA 规范(2 篇) 非特权规范特权规范 非 ISA 规范(6篇) Trace规范ABI 规范外部调试规范PLIC 规范SBI 规范UEFI 协…...
【C】线程控制
创建线程 #include <pthread.h>int pthread_create(pthread_t * thread,const pthread_attr_t * attr,void *(*start_routine)(void*), void * arg);返回值:成功返回0,失败返回错误号。 thread:成功返回后,新创建的线程的…...

Maven工程打jar包的N种方式
Maven工程打jar包 一、IDEA自带打包插件二、maven插件打包2.1 制作瘦包(直接打包,不打包依赖包)2.2 制作瘦包和依赖包(相互分离)2.3 制作胖包(项目依赖包和项目打为一个包)2.4 制作胖包…...

一文了解GPU并行计算CUDA
了解GPU并行计算CUDA一、CUDA和GPU简介二、GPU工作原理与结构2.1、基础GPU架构2.2、GPU编程模型2.3、软件和硬件的对应关系三、GPU应用领域四、GPUCPU异构计算五、MPI与CUDA的区别一、CUDA和GPU简介 CUDA(Compute Unified Device Architecture)…...

全网资料最全Java数据结构与算法(1)
一、数据结构和算法概述 1.1什么是数据结构? 官方解释: 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。 大白话: 数据结构就是把数据元素按照一定的关系组织起来的集合&a…...
【项目实战】SpringMVC拦截器HandlerInterceptor入门介绍
一、拦截器介绍 拦截器是应用程序级框架中常用的拦截用户请求、实施业务流程控制的模式,它可以将一些公共的、重复发生的业务逻辑从业务处理代码中独立出来,使系统的结构更加清晰,程序的复杂度也减小了。 拦截器是一个常见的特性,它可以实现任何自定义功能,而无需调整业…...

阿里淘宝新势力造型合伙人P8、年薪百万的欧阳娜娜也躲不过的魔鬼面试,看的我心服口服
阿里淘宝新势力造型合伙人P8、年薪百万的欧阳娜娜跳槽了,这不是关键。 她参加了网易有道明星语音录音员/代言人的面试,这也不是关键。 关键是她教科书式的面试过程,狠狠地给我们上了一课。 我是无意间刷到的这个视频的时候,就一…...

深度学习笔记:不同的反向传播迭代方法
1 随机梯度下降法SGD 随机梯度下降法每次迭代取梯度下降最大的方向更新。这一方法实现简单,但是在很多函数中,梯度下降的方向不一定指向函数最低点,这使得梯度下降呈现“之”字形,其效率较低 class SGD:"""随机…...

ElasticSearch 学习笔记总结(三)
文章目录一、ES 相关名词 专业介绍二、ES 系统架构三、ES 创建分片副本 和 elasticsearch-head插件四、ES 故障转移五、ES 应对故障六、ES 路由计算 和 分片控制七、ES集群 数据写流程八、ES集群 数据读流程九、ES集群 更新流程 和 批量操作十、ES 相关重要 概念 和 名词十一、…...

深入理解border以及应用
深入border属性以及应用👏👏 border这个属性在开发过程中很常用,常常用它来作为边界的。但是大家真的了解border吗?以及它的形状是什么样子的。 我们先来看这样一段代码:👏 <!--* Author: syk 185901…...
如何复现论文?什么是论文复现?
参考资料: 学习篇—顶会Paper复现方法 - 知乎 如何读论文?复现代码?_复现代码是什么意思 - CSDN 我是如何复现我人生的第一篇论文的 - 知乎 在我看来,论文复现应该有一个大前提和分为两个层次。 大前提是你要清楚地懂得自己要…...
22.2.28打卡 Codeforces Round #851 (Div. 2) A~C
A题 One and Two 题面翻译 题目描述 给你一个数列 a1,a2,…,ana_1, a_2, \ldots, a_na1,a2,…,an . 数列中的每一个数的值要么是 111 要么是 222 . 找到一个最小的正整数 kkk,使之满足: 1≤k≤n−11 \leq k \leq n-11≤k≤n−1 , anda1⋅a2⋅……...

Learining C++ No.12【vector】
引言: 北京时间:2023/2/27/11:42,高数考试还在进行中,我充分意识到了学校的不高级,因为题目真的没什么意思,虽然挺平易近人,但是……,考试期间时间比较放松,所以不能耽误…...

【数电基础】——逻辑代数运算
目录 1.概念 1.基本逻辑概念 2.基本逻辑电路(与或非) 逻辑与运算 与门电路: 逻辑或运算 或门电路: 逻辑非运算(逻辑反) 非门电路编辑 3.复合逻辑电路(运算) 与非逻辑…...

【Redis】什么是缓存与数据库双写不一致?怎么解决?
1. 热点缓存重建 我们以热点缓存 key 重建来一步步引出什么是缓存与数据库双写不一致,及其解决办法。 1.1 什么是热点缓存重建 在实际开发中,开发人员使用 “缓存 过期时间” 的策略来实现加速数据读写和内存使用率,这种策略能满足大多数…...

互联网衰退期,测试工程师35岁之路怎么走...
国内的互联网行业发展较快,所以造成了技术研发类员工工作强度比较大,同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高,超过35岁的基层研发类员工,往往因为家庭原因、身体原因,比较难以跟得上工作…...

动态规划(以背包问题为例)
1) 要求达到的目标为装入的背包的总价值最大,并且重量不超出2) 要求装入的物品不能重复动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。动态规划算法与分治算法类似ÿ…...

Java异常
异常的体系结构 在java的Throwable下有Error和Exception两个子类 Error(错误):程序运行中出现了严重的问题,非代码性错误,无法处理,常见的有虚拟机运行错误和内存溢出等Exception(异常):是由于代码本身造成的问题,可以进行处理,异常一个可以分为运行时异常和编译时异常 运行…...

别克GL8改装完工,一起来看看效果
①豪华商务头等舱 别克GL8作为商务车,不管是家用还是商务接待,原车内饰都太掉档次了,所以车主要求全部换掉。>>织布座椅换成航空座椅 主副驾:改装纳帕皮 中排:改装水晶宝座豪华版航空座椅,带通风、加…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...