Android類加載(一)——DVM烟很、ART颈墅、Dexopt、DexAot名詞解析
Android類加載(二)——雙親委托機(jī)制
Android類加載(三)——源碼解讀
JVM和DVM
DVM基于寄存器雾袱,JVM基于棧
寄存器是CPU上面的一塊存儲空間恤筛,棧是內(nèi)存上面的一段連續(xù)的存儲空間,所以CPU直接訪問自己上面的一塊空間的數(shù)據(jù)的效率肯定要大于訪問內(nèi)存上面的數(shù)據(jù)芹橡《咎常基于棧架構(gòu)的程序在運(yùn)行時(shí)虛擬機(jī)需要頻繁的從棧上讀取或?qū)懭霐?shù)據(jù),這個(gè)過程需要更多的指令分派與內(nèi)存訪問次數(shù)林说,會耗費(fèi)不少CPU時(shí)間煎殷,對于像手機(jī)設(shè)備資源有限的設(shè)備來說,這是相當(dāng)大的一筆開銷腿箩。DVM基于寄存器架構(gòu)豪直。數(shù)據(jù)的訪問通過寄存器間直接傳遞,這樣的訪問方式比基于棧方式要快很多珠移。
執(zhí)行的字節(jié)碼文件不一樣
DVM執(zhí)行的是.dex文件顶伞,JVM執(zhí)行的是.class文件。
DVM解釋執(zhí)行的是dex字節(jié)碼.dex:.java –> .class –> .dex –> .apk
JVM運(yùn)行的是java字節(jié)碼.class:.java –> .class –> .jar
本質(zhì)上java文件編譯后都是字節(jié)碼剑梳,只不過JVM運(yùn)行的是.class字節(jié)碼,而DVM運(yùn)行的是.dex字節(jié)碼
ART與Dalvik
Dalvik:Dalvik是谷歌公司自己設(shè)計(jì)用于Android平臺的Java虛擬機(jī)(DVM)滑潘。支持已轉(zhuǎn)換為.dex格式的應(yīng)用程序的運(yùn)行垢乙。.dex格式是專門為DVM設(shè)計(jì)的一種壓縮格式,適合內(nèi)存和處理器有限的系統(tǒng)语卤,例如Android系統(tǒng)追逮。(DVM負(fù)責(zé)解釋.dex文件為機(jī)器碼)
ART:Android Runtime,Android4.4中引入的一個(gè)開發(fā)者選項(xiàng)粹舵,也是Android5.0及更高版本的默認(rèn)模式钮孵。在應(yīng)用安裝的時(shí)候把字節(jié)碼預(yù)編譯成機(jī)器語言,這一機(jī)制叫做Ahead-Of-Time(AOT)預(yù)編譯眼滤。這樣應(yīng)用程序雖然安裝會很慢巴席,但是執(zhí)行效率將更高,啟動更快诅需。
- 機(jī)器碼是直接運(yùn)行在機(jī)器上的漾唉,字節(jié)碼要解釋翻譯成機(jī)器碼荧库,在arm手機(jī)和x86手機(jī)上的機(jī)器碼是不一樣的,所以不能在app打包的時(shí)候編譯成機(jī)器碼赵刑,要在應(yīng)用安裝的時(shí)候編譯成手機(jī)對應(yīng)的機(jī)器碼
- 在Dalvik下分衫,應(yīng)用需要解釋執(zhí)行,運(yùn)行效率低般此。
- ART占用空間比DVM大蚪战,“空間換時(shí)間”。
- 預(yù)編譯成機(jī)器碼也可以改善電池的續(xù)航能力铐懊,因?yàn)閼?yīng)用程序每次運(yùn)行時(shí)不用再重復(fù)編譯了邀桑,從而減少了CPU的使用頻率,降低了能耗居扒。
Dexopt與DexAot
-
Dexopt:通常情況下概漱,我們看到的Android應(yīng)用程序?qū)嶋H上是一個(gè)以.apk為后綴名的壓縮文件。我們可以通過壓縮工具對apk進(jìn)行解壓喜喂,解壓出來的內(nèi)容中有一個(gè)名為classes.dex的文件瓤摧,我們應(yīng)用在啟動的時(shí)候,classes.dex的文件會被加載到DVM中玉吁,函數(shù)dexopt會對dex字節(jié)碼進(jìn)行優(yōu)化照弥,實(shí)際上也就是由dex文件生成odex文件。
image.png DexAot:ART模式下进副,應(yīng)用在安裝時(shí)这揣,對dex文件執(zhí)行dexopt優(yōu)化后,再將odex文件進(jìn)行AOT預(yù)編譯操作(dexAot)影斑,編譯為OAT可執(zhí)行文件(機(jī)器碼)