Android4.4版本以前是Dalvik虛擬機(jī),4.4版本開始引入ART虛擬機(jī)(Android Runtime)。在4.4版本上,兩種運(yùn)行時環(huán)境共存,可以相互切換,但是在5.0版本以后,Dalvik虛擬機(jī)則被徹底的丟棄,全部采用ART。
ART
ART 是一種執(zhí)行效率更高且更省電的運(yùn)行機(jī)制,執(zhí)行的是本地機(jī)器碼,這些本地機(jī)器碼是從dex字節(jié)碼轉(zhuǎn)換而來。ART采用的是AOT(Ahead-Of-Time)編譯,應(yīng)用在第一次安裝的時候,字節(jié)碼就會預(yù)先編譯成機(jī)器碼存儲在本地。在App運(yùn)行時,ART模式就較Dalvik模式少了解釋字節(jié)碼的過程,所以App的運(yùn)行效率會有所提高,占用內(nèi)存也會相應(yīng)減少。谷哥在5.0以后的Android版本中默認(rèn)了ART模式啟動,就是希望Android能擺脫卡頓這個毛病。
Dalvik
Dalvik 虛擬機(jī)采用的是JIT(Just-In-Time)編譯模式,意思為即時編譯,我們知道apk被安裝到手機(jī)中時,對應(yīng)目錄會有dex或odex和apk文件,apk文件存儲的是資源文件,而dex或odex(經(jīng)過優(yōu)化后的dex文件內(nèi)部存儲class文件)內(nèi)部存儲class文件,每次運(yùn)行app時虛擬機(jī)會將dex文件解釋翻譯成機(jī)器碼,這樣才算是本地可執(zhí)行代碼,之后被系統(tǒng)運(yùn)行。
Dalvik虛擬機(jī)可以看做是一個Java VM,他負(fù)責(zé)解釋dex文件為機(jī)器碼,如果我們不做處理的話,每次執(zhí)行代碼,都需要Dalvik將dex代碼翻譯為微處理器指令,然后交給系統(tǒng)處理,這樣效率不高。為了解決這個問題,Google在2.2版本添加了JIT編譯器,當(dāng)App運(yùn)行時,每當(dāng)遇到一個新類,JIT編譯器就會對這個類進(jìn)行編譯,經(jīng)過編譯后的代碼,會被優(yōu)化成相當(dāng)精簡的原生型指令碼(即native code),這樣在下次執(zhí)行到相同邏輯的時候,速度就會更快。
兩者的區(qū)別
- Dalvik每次都要編譯再運(yùn)行,Art只會安裝時啟動編譯
- Art占用空間比Dalvik大(原生代碼占用的存儲空間更大),就是用“空間換時間”
- Art減少編譯,減少了CPU使用頻率,使用明顯改善電池續(xù)航
- Art應(yīng)用啟動更快、運(yùn)行更快、體驗更流暢、觸感反饋更及時
總結(jié)
ART、Dalvik、AOT、JIT四個名稱的關(guān)系:
- JIT代表運(yùn)行時編譯策略,也可以理解成一種運(yùn)行時編譯器,是為了加快Dalvik虛擬機(jī)解釋dex速度提出的一種技術(shù)方案,來緩存頻繁使用的本地機(jī)器碼
- ART和Dalvik都算是一種Android運(yùn)行時環(huán)境,或者叫做虛擬機(jī),用來解釋dex類型文件。但是ART是安裝時解釋,Dalvik是運(yùn)行時解釋
- AOT可以理解為一種編譯策略,即運(yùn)行前編譯,ART虛擬機(jī)的主要特征就是AOT