了解Dalvik和ART
- 什么是Dalvik:Dalvik是Google公司自己設(shè)計用于Android平臺的Java虛擬機攀唯。支持已轉(zhuǎn)換為.dex(Dalvik Executable)格式的Java應(yīng)用程序的運行,.dex格式是專為Dalvik應(yīng)用設(shè)計的一種壓縮格式娄昆,適合內(nèi)存和處理器速度有限的系統(tǒng)(移動平臺)浸船。DVM的指令集是基于寄存器的章贞,執(zhí)行效率高(JVM的指令集是基于棧的 更通用备埃,跨平臺性好)
- 什么是ART:Android Runtime尼桶, Android 4.4 中引入的一個開發(fā)者選項,也是 Android 5.0 及更高版本的默認模式搀庶。在應(yīng)用安裝的時候Ahead-Of-Time(AOT)預(yù)編譯字節(jié)碼到機器語言拐纱,這一機制叫Ahead-Of-Time(AOT)預(yù)編譯。應(yīng)用程序安裝會變慢地来,但是執(zhí)行將更有效率戳玫,啟動更快。(為什么不打包apk的時候生成機器語言的包:因為手機的平臺不同 arm 和 X86 對應(yīng)的機器碼不一樣未斑,需要在對應(yīng)平臺生成相應(yīng)的機器語言才能執(zhí)行,同時打包apk(dex文件)也是為了跨平臺)
-
Dalvik 和 ART的區(qū)別:
1)在Dalvik下币绩,應(yīng)用運行需要解釋執(zhí)行蜡秽,把需要頻繁執(zhí)行的代碼(熱點代碼)通過即時編譯器(JIT)將字節(jié)碼轉(zhuǎn)換為機器碼保存在緩存中以提高代碼執(zhí)行效率,但是總的來說Dalvik運行效率低缆镣。而在ART 環(huán)境中芽突,應(yīng)用在安裝時,字節(jié)碼預(yù)編譯(AOT)成機器碼董瞻,安裝慢了寞蚌,但運行效率會提高田巴。
2)ART占用空間比Dalvik大(字節(jié)碼變?yōu)闄C器碼), “空間換時間"挟秤。
3)預(yù)編譯也可以明顯改善電池續(xù)航壹哺,因為應(yīng)用程序每次運行時不用重復(fù)編譯了,從而減少了 CPU 的使用頻率艘刚,降低了能耗管宵。 -
ART是兼容Dalvik的:ART會執(zhí)行AOT,但針對 Dalvik 開發(fā)的應(yīng)用也能在 ART 環(huán)境中運作攀甚。
ART和Dalvik下APP的啟動
DexOpt與DexAot
- DexOpt:對 dex 文件 進行 驗證 和 優(yōu)化 為odex(Optimized dex) 文件
-
DexAot:在安裝時對 dex 文件執(zhí)行dexopt優(yōu)化之后再將odex進行 AOT 提前編譯操作箩朴,編譯為OAT可執(zhí)行文件(機器碼)。
apk在Dalvik和ART下的運行流程
ClassLoader :Java 類加載器
- BootClassLoader:用于加載Android Framework層class文件秋度。
- PathClassLoader: 用于Android應(yīng)用程序類加載器炸庞。可以加載指定的dex荚斯,以及jar燕雁、zip、apk中的classes.dex
- DexClassLoader: 加載指定的dex鲸拥,以及jar拐格、zip、apk中的classes.dex
- InMemoryDexClassLoader: android 8.0 以后推出的 可以加載內(nèi)存中的一個dex文件刑赶。
- DexClassLoader和PathClassLoader的區(qū)別: DexClassLoader 需要指定一個dex文件優(yōu)化成odex后存儲odex的目錄(必須是APP的私有目錄(context.getCodeCacheDir())捏浊,不能是sd卡的目錄),PathClassLoader有默認的odex的存儲目錄(data/dalvik-cache)撞叨。
雙親委托機制
某個類加載器在加載類時金踪,首先將加載任務(wù)委托給父類加載器,依次遞歸牵敷,如果父類加載器可以完成類加載任務(wù)胡岔,就成功返回;只有父類加載器無法完成此加載任務(wù)或者沒有父類加載器時枷餐,才自己去加載靶瘸。
loadClass 解析
-
雙親委托機制的作用:
1、防止重復(fù)加載同一個.class毛肋。通過委托去向上面問一問怨咪,加載過了,就不用再加載一遍润匙。保證數(shù)據(jù)安全诗眨。
2、保證核心.class不能被篡改孕讳。通過委托方式匠楚,不會去篡改核心.class巍膘,即使篡改也不會去加載,即使加載也不會是同一個.class對象了芋簿。不同的加載器加載同一個.class也不是同一個Class對象峡懈。這樣保證了Class執(zhí)行安全。