理清 .dex、.odex、ART、AOT、OAT 等近似名称的概念和意义。
apk的打包过程
最终 apk 内的代码文件为 .dex 文件。
AOT:编译方式,运行前编译。
JIT:编译方式,动态编译。
Dalvik:Android 5.0 之前默认虚拟机。
ART:Android 5.0 及其之后默认虚拟机。
OAT:Android 私有 ELF 文件格式,后缀为 .odex。不仅包含从 .dex 翻译过来的二进制本地机器指令,还包含原来的 .dex 文件内容。这使得无需重新编译原 APK 就能直接在 ART 中运行。
名称 | 编译方式 | 特性 | 备注 |
---|---|---|---|
Dalvik | JIT | 运行时编译 .dex,.dex 是 DVM 使用的运行时编译字节码。系统第一次开机会提取 apk 内的 dex 文件生成 .odex,以提升运行时编译的速度。 | 此 .odex 只是对 .dex 文件的提取,这样运行时无需再次从 apk 提取,可以加速编译,并非可执行文件。 |
ART | AOT | 安装时编译。安装时生成 OAT 文件,该文件包含机器码,可以直接运行。 | 此 .odex 可以直接运行。 |
Android N 之后 | JIT、AOT 混编 | 安装时 JIT,系统空闲时 AOT 针对 "热代码"(常用代码块)编译为 OAT 保存在本地。 | 时间、空间的综合方案。 |