aot,oat,art...是不是有的時(shí)候傻傻分不清楚,該文章主要解釋dalvik, Art,JIT ,AOT, oat, dex, odex這些概念,已便于理解Android 應(yīng)用編譯和運(yùn)行的過程及安裝過程。?
執(zhí)行環(huán)境dalvik, Art
dalvik這個(gè)大家肯定很熟悉 Dalvik是Google公司設(shè)計(jì)用于Android平臺(tái)的Java虛擬機(jī)?
Art是(Android runtime) 在Android系統(tǒng)4.4提出 在5.0之后完全棄用dalvik 全部采用art為執(zhí)行環(huán)境
在Dalvik下,應(yīng)用每次運(yùn)行的時(shí)候,字節(jié)碼都需要通過即時(shí)編譯器(JIT)轉(zhuǎn)換為機(jī)器碼,這會(huì)拖慢應(yīng)用的運(yùn)行效率,而在ART 環(huán)境中,應(yīng)用在第一次安裝的時(shí)候,字節(jié)碼就會(huì)預(yù)先編譯成機(jī)器碼(這種機(jī)制稱為AOT) 這樣的話,應(yīng)用執(zhí)行變得更加快速。
編譯模式 JIT,AOT
上述提到的兩種編譯模式j(luò)it 和aot,可以理解為是一種編譯策略
?JIT (just in time)??運(yùn)行時(shí)編譯?
AOT (Ahead-Of-Time) ??運(yùn)行前編譯 Art的主要特征就是AOT
文件格式 oat dex和odex
dex(Dalvik Executable)格式是專門為Dalvik設(shè)計(jì)的一種壓縮格式,
? ? ? ? (javac) ? ? ? ???(dx工具)
.java------>.class------->.dex
.java文件經(jīng)過javac編譯器生成.class字節(jié)碼 再經(jīng)過。dx工具生成.dex
odex(optimized dex)即優(yōu)化的dex
對(duì)于在dalvik環(huán)境中 使用dexopt來對(duì)dex字節(jié)碼進(jìn)行優(yōu)化 生成odex文件 最終存在手機(jī)的data/dalvik-cache目錄下
對(duì)于art環(huán)境,使用dex2oat工具來對(duì)dex字節(jié)碼生成oat文件
oat文件是art的核心,oat文件包含oatdata和oatexec
前者包含dex文件內(nèi)容,后者包含生成的本地機(jī)器指令,進(jìn)而可以直接運(yùn)行,同樣保存在手機(jī)的data/dalvik-cache目錄下
PMS(PackgetManagerService)--->installd(守護(hù)進(jìn)程)------>dex2oat(/system/bin/dex2oat)
注意存放在data/dalvik-cache目錄下的后綴名都仍為.dex 前者其實(shí)表示一個(gè)優(yōu)化過的.dex文件 后者為.oat文件
apk安裝過程
大家都知道 apk其實(shí)就是zip包 apk安裝過程其實(shí)就是解壓過程
用戶應(yīng)用安裝涉及以下幾個(gè)目錄
data/app 安裝目錄 安裝時(shí)會(huì)把a(bǔ)pk文件copy到這里
data/dalvik-cache 如上述描述中的存放.dex(.odex 無論davilk的dex 還是art的oat格式)
data/data/pkg/ 存放應(yīng)用程序的數(shù)據(jù)