ART、Dalvik、JIT、AOT等相关概念
一、ART、Dalvik、JIT、AOT
Dalvik、ART(Android Runtime):Android 虚拟机
ART 引入了 AOT(预先编译)机制,可以提高应用性能。在安装时,ART使用设备自带的 dex2oat
工具来编译应用,此工具使用dex作为输入,并为目标设备生成经过编译的应用可执行文件(.oat)
,该文件 是ELF 文件格式。
ART 也包含 一个具备代码分析功能的 即时(JIT)编译器,该编译器可以在Android 应用运行时持续提高其性能。JIT编译器是对 AOT编译器进行了补充,可提升运行时性能,节省存储空间,加快应用和系统更新速度。
所以 ART 中 AOT 和 JIT 是同时存在的。 JIT中也提到了,这是一个持续改进的过程。 AOT 和 JIT 都是持续进行优化的。
JIT架构图果同时存在 JIT 和 AOT 代码(例如,由于反复进行逆优化),经过 JIT 编译的代码将是首选代码。
二、dexopt、dex2oat、.odex
来自网络dexopt
对dex文件做一些优化。它做了一些事情,比如用一个优化版本替换一个虚拟调用指令,该优化版本包括被调用方法的vtable索引,这样就不必在执行期间执行方法查找。
dexopt的结果是一个 odex(优化的dex)文件
。这与原始dex文件非常相似,除了它使用一些优化的操作码,如优化的调用虚拟指令。
dex2oat
需要一个dex文件并编译它。结果本质上是一个elf文件,然后本机执行。因此,代替由虚拟机解释的字节码,它现在具有可以由处理器本地执行的本地代码,这称为AOT(提前)编译。
三、.art .oat .vdex
dex文件经过dex2oat编译,会生成.art、.oat两个文件,oat是一个android定制的elf文件,原始dex也保存在其中。8.0后,dex单独保存到.vdex文件中。art文件类似于一个内存映像,缓存常用的ArtField、ArtMethod、DexCache等内容,加载后可直接使用,避免解析耗时。
参考:
https://source.android.google.cn/devices/tech/dalvik?hl=zh_cn
https://source.android.google.cn/devices/tech/dalvik/jit-compiler?hl=zh_cn
http://www.voidcn.com/article/p-mtcwktnt-bsu.html
https://www.jianshu.com/p/065e358b9599