目的
理清 .dex、.odex、ART、AOT、OAT 等近似名稱的概念和意義。
APK 生成

apk的打包過(guò)程
最終 apk 內(nèi)的代碼文件為 .dex 文件。
APK 安裝運(yùn)行
基礎(chǔ)概念
AOT:編譯方式,運(yùn)行前編譯。
JIT:編譯方式,動(dòng)態(tài)編譯。
Dalvik:Android 5.0 之前默認(rèn)虛擬機(jī)。
ART:Android 5.0 及其之后默認(rèn)虛擬機(jī)。
OAT:Android 私有 ELF 文件格式,后綴為 .odex。不僅包含從 .dex 翻譯過(guò)來(lái)的二進(jìn)制本地機(jī)器指令,還包含原來(lái)的 .dex 文件內(nèi)容。這使得無(wú)需重新編譯原 APK 就能直接在 ART 中運(yùn)行。
多種安裝運(yùn)行方式
| 名稱 | 編譯方式 | 特性 | 備注 |
|---|---|---|---|
| Dalvik | JIT | 運(yùn)行時(shí)編譯 .dex,.dex 是 DVM 使用的運(yùn)行時(shí)編譯字節(jié)碼。系統(tǒng)第一次開機(jī)會(huì)提取 apk 內(nèi)的 dex 文件生成 .odex,以提升運(yùn)行時(shí)編譯的速度。 | 此 .odex 只是對(duì) .dex 文件的提取,這樣運(yùn)行時(shí)無(wú)需再次從 apk 提取,可以加速編譯,并非可執(zhí)行文件。 |
| ART | AOT | 安裝時(shí)編譯。安裝時(shí)生成 OAT 文件,該文件包含機(jī)器碼,可以直接運(yùn)行。 | 此 .odex 可以直接運(yùn)行。 |
| Android N 之后 | JIT、AOT 混編 | 安裝時(shí) JIT,系統(tǒng)空閑時(shí) AOT 針對(duì) "熱代碼"(常用代碼塊)編譯為 OAT 保存在本地。 | 時(shí)間、空間的綜合方案。 |