Android ART dex2oat

news2024/11/23 16:47:42

一、什么是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

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

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

相关文章

谷歌搜索技巧大全 | 谷歌高级搜索语法指令

谷歌搜索技巧是利用各种高级搜索语法或者搜索指令,让我们能够使用Google进行精确化的搜索,外贸找客户和学术文件查找都可以应用到这些搜索技巧。(大部分命令也适用百度搜索)。Google通过互联网收集数据,抓取有意义的信息,将其存储…

flask入门-4.项目实战

4. 项目实战1 1. 问答平台项目结构搭建 项目结构 config.py hostname "127.0.0.1" port 3306 username "root" password "root"database "flask_qa"# 在 app.config 中设置连接数据库的信息 SQLALCHEMY_DATABASE_URI f"…

【Redis】什么是缓存与数据库双写不一致?怎么解决?

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

ECharts基础知识详细介绍

文章目录知识点ECharts 实例ECharts 基础配置组件seriesdataset用 option 描述图表titletooltiplegend 图例组件toolbox 工具栏坐标轴知识点 ECharts 实例series 与 datasetECharts 基础配置用 option 描述图表坐标系 ECharts 实例 一个网页中可以创建多个 ECharts 实例。每个…

JPA——Java.util.Date和Java.sql.Date

纵观整个项目的字段,最难搞的就是Date类型。今天我们就好好唠唠java中的两个Date类 一、Java.sql.Date 1. 构造方法 Date date new Date(System.currentTimeMillis());System.out.println(date);//2023-02-282. 常用方法: 方法作用void setTime(long…

【Java开发】JUC基础 04:Synchronized、死锁、Lock锁

1 概念介绍并发:同一个对象被多个线程同时操作📌 线程同步现实生活中,我们会遇到“同一个资源,多个人都想使用”的问题,比如,食堂排队打饭,每个人都想吃饭,最天然的解决办法就是,排队…

强化学习RL 04: Actor-Critic Algorithm

actor: 是policy network,通过生成动作概率分布,用来控制agent运动,类似“运动员”。critic: 是value network,用来给动作进行打分,类似“裁判”。构造这两个网络,并通过environment奖励来学习这两个网络。…

AQS抽象队列同步器

aqs 抽象队列同步器,内部存储了一个valitail修饰的status 和内部类node ,来实现对共享变量并发同步队列机制,以reentrantLock为例,lock底层实际上调用的是sync的lock,会调用cas对status的状态进行修改,来确定是否获得锁…

学习 Python 之 Pygame 开发魂斗罗(七)

学习 Python 之 Pygame 开发魂斗罗(七)继续编写魂斗罗1. 载入水中图片并添加在水中的标志2. 修改玩家类函数3. 增加河的碰撞体4. 实现玩家在河中的样子继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗(六)中&#…

csgo搬砖项目详细拆解,附选品+详细操作教程

项目实操 一:项目原理 csgo这款游戏不知道大家玩过没有,如果不了解的话,那你肯定知道穿越火线这款游戏吧,都是一个类型的射击游戏。 说到csgo,就得所以一下今天项目的平台steam,它是一个游戏平台&#x…

Redis面试问题总结

1. 什么是Redis?Redis 是一个使用 C 语言写成的,开源的高性能key-value非关系缓存数据库。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。…

【Redis】Redis主从同步中数据同步原理

【Redis】Redis主从同步中数据同步原理 文章目录【Redis】Redis主从同步中数据同步原理1. 全量同步1.1 判断是否第一次数据同步2. 增量同步3. 优化Redis主从集群4. 总结1. 全量同步 主从第一次同步是全量同步。 数据同步包括以下三个阶段: 在从节点执行slaveof命令…

技术分担产品之忧(上):挑选有业务专家潜力的人

你好,我是王植萌,去哪儿网的高级技术总监、TC主席。从2014年起,担任一个部门的技术负责人,有8年技术总监经验、5年TC主席的经验。这节课我会从去哪儿网产研融合的经验出发,和你聊一聊怎么让技术分担产品之忧。 技术分…

SSL证书与我们普通人之间有什么关系

对于很多普通人来说,SSL证书似乎会感到很陌生,总觉得离自己很遥远,从而并没有引起察觉。要是这么想的话那么就真的大错特错了,其实SSL证书与我们普通人之间还是很密密相关的,是我们应该都需要关注的,下面就…

cesium学习记录02-vue项目中cesium的配置与使用

1,下载cesium包 (当然,使用npm install cesium安装也是可以的,不过在这里选择下载包放到本地) 官方下载地址 笔者的cesium版本为1.101 2,将下载的Cesium文件夹放到项目里某个位置 这里,笔者将…

又一个国内类ChatGPT模型?【秘塔科技上线自研LLM大模型「对话写作猫」】

又一个国内类ChatGPT模型?【秘塔科技上线自研LLM大模型「对话写作猫」】 (马上被打脸 ~ ~) 一直期待中国有没有类ChatGPT产品可以出现。 昨天,2023年2月27日,秘塔科技上线了自研LLM大模型「对话写作猫」,…

全屋Wi-Fi领域「兵戎相见」,鸿雁这一局赢面大不大?

作者 | 牧之 编辑 | 小沐 出品 | 智哪儿 zhinaer.cn相比全屋智能,另一个刚需属性更强,消费规模更大的细分市场,便是全屋Wi-Fi。在这个板块,当鸿雁入局的时候,笔者还是有些许的「诧异」。毕竟,鸿雁给大众的印…

【Vue3】vue3 + ts 封装城市选择组件

城市选择-基本功能 能够封装城市选择组件&#xff0c;并且完成基础的显示隐藏的交互功能 &#xff08;1&#xff09;封装通用组件src/components/city/index.vue <script lang"ts" setup name"City"></script> <template><div class…

【PyTorch】教程:torch.nn.Conv2d

Conv2d CLASS torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone) 2D 卷积 out(Ni,Coutj)bias(Coutj)∑k0Cin−1Weight(Coutj,k)∗input(Ni,k)out(N_i, C_{out_j})bias(C_…

k8s环境jenkins发布vue项目指定nodejs版本

k8s环境jenkins发布vue项目指定nodejs版本1、背景2、分析3、解决方法3.1、 找到配置镜像位置3.2、 制作新镜像3.3、 推送镜像到私有仓库3.4、 修改配置文件1、背景 发布一个前端项目&#xff0c;它需要nodejs 16.9.0版本支持&#xff0c;而kubesphere 3.2.0集成的jenkins 的镜…