微工具箱强制odex2oat(dexopt 与 dex2oat 区别)

本文目录
dexopt 与 dex2oat 区别
答: 这道题目如果想深入理解就需要去看源码了,不过对于应用层开发来说有个原理上的大致理解也是必须掌握的,具体区别可用如下图概述()。
通过上图可以很明显的看出 dexopt 与 dex2oat 的区别,前者针对 Dalvik 虚拟机,后者针对 Art 虚拟机。
除此之外在上图还可以看到 Dalvik 虚拟机中有使用 JIT 编译器,也就是说其也能将程序运行的热点 java 字节码编译成本地 code 执行,所以其与 Art 虚拟机还是有区别的。Art 虚拟机的 dex2oat 是提前编译所有 dex 字节码,而 Dalvik 虚拟机只编译使用启发式检测中最频繁执行的热点字节码。
强制dex2oat伤手机吗
伤手机。dex2oat是在安装app的时候转化java代码到机器码,这样会大幅提高程序效率,根据查询相关资料显示,如果强制停止dex2oat会导致手机卡顿,因为违背了art虚拟机设计的初衷会影响运行速度,久而久之会伤害手机运行速度,不能够强制停止dex2oat的运行。
细说dex2oat(1) - dex2oat的命令行参数
首先我们先看一下dex2oat都支持一些什么样的命令行参数:
上面我们学习了dex2oat的参数的简介,下面我们学以致用,看看在真实的环境中它们是如何被使用的。
我们直接看build时,dex2oat的参数是如何被传进去的,在build/core/dex_preopt_libart.mk中:
首先指定两个运行时参数,这两个参数是在前面定义的:
也就是说,这两个值取自属性dalvik.vm.dex2oat-Xms和vm.dex2oat-Xmx。这两个属性是哪里来的呢,是在/build/target/product/runtime_libart.mk中,编译的时候指定进来的:
这样,这两个值分别是64m和512m。
我们回到dex_preopt_libart.mk中继续看:
查这个PRIVATE_DEX_PREOPT_IMAGE_LOCATION,定义于/build/core/setup_one_odex.mk中:
然后再向上追my_dex_preopt_image_location
LOCAL_DEX_PREOPT_IMAGE_LOCATION没有定义,继续顺藤摸瓜。
再继续追DEXPREOPT_BOOT_JAR_DIR_FULL_PATH:
先看后面的DEXPREOPT_BOOT_JAR_DIR,原来就是system/framework
再看前面的DEXPREOPT_PRODUCT_DIR_FULL_PATH,是out下的dex_bootjars
最后 --boot-image 的值为 out/dex_bootjars/system/framework/boot.art
这个就不多说了
追查:
这个板级驱动已经配好了。
在同样的位置定义:
include-patch-information兼runtime-arg -Xnorelocate,生成重定位的信息,因为后面还要走patchoat呢。
no-generate-debug-info,不生成调试信息
大家留神啊,现在已经是selinux的时代了,dex2oat也需要配置相关的权限:
这还不算,在installd的权限配置/external/sepolicy/installd.te中,明确设置了
前面讲的参数中,有一项是--boot-image。我们先看一下这个boot-image是如何编出来的,正好是一个完整的dex2oat的例子.
我们看下在MediaTek MT6753平台下,是如何生成的。
MT6753是64位Cortex-A53的架构,所以boot.art也是64位和32位两套。
先看64位的吧:
初始堆大小和最大堆大小。
预加载类的路径
以上是一大堆的dex文件
以上是上面那一大堆dex对应的jar文件路径
符号表的位置
输出文件有两个:一个是boot.oat,一个是boot.art。
基地址0x70000000
对于指令架构,除了arm64,更细的是cortex-a53
最后这几个前面都说过了。
上面都是java和dex,所以跟64位没有什么区别。
输出文件从arm64目录换到了arm目录
基地址没变,反正patchoat的时候也还要改。
指令集从arm64变成了arm,其它的参数都不变
这两个值在前面分析Android.oat.mak时已经分析过了,这里验证了我们的分析是正确的。
这个boot.art就是上一节讲的命令刚刚生成的。
输入的dex文件
输出到odex文件,虽然名字叫odex,但是实际上是个oat。普通的应用就不像上节讲的输出boot.oat和boot.art的时候那样输出那么多了,只有一个odex文件,符号表和image都不用。
在Android的mk系统中,调用dex2oat中有几处,但是真正被调用来生成目标系统上的oat的是下面这个,位于/build/core/dex_preopt_libart.mk中:
这个dex2oat-one-file,是被dexpreopt-one-file调用,位于/build/core/dex_preopt.mk中:
以下根据生成的类型不同,包、库、预先编译好的应用有不同的路径。
/build/core/package_internal.mk
/build/core/java_library.mk
我们再来看看,odex是如何被install到system分区下面的。
我们看一个实际的例子:
除了编译之外,我们得先看一些预先定义好的函数。它们定义于/build/core/definitions.mk中。
将class文件压缩成classes*.dex
将依赖文件复制到目标文件

更多文章:
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20
scrollthrough意思(“scroll”是什么意思)
2026年9月7日 08:00
怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)
2026年9月7日 06:30



