dex
- 關于dex先說幾點股淡,我們知道java生成的是class文件,jvm也是基于棧的虛擬機乏奥,而Dalvik和ART都是基于寄存器的虛擬機谅畅,所以在build的時候登渣,不僅僅是簡單合并和去除重復,還要轉(zhuǎn)變指令和數(shù)據(jù)結(jié)構(gòu)
apk
- apk實質(zhì)上就是一個zip文件毡泻,只是改了后綴名而已胜茧,apk里面放著dex文件、native代碼文件(.so)仇味、資源文件呻顽、Manifest.xml
apk的安裝過程
- 當通過SD卡上的APK安裝時,會先把apk復制到/data/app下丹墨,然后執(zhí)行下面的操作
- 安裝過程其實就是一個解壓過程廊遍,對于Dalvik和ART兩種虛擬機對dex文件有不同的優(yōu)化處理,這個過程叫做optdex贩挣,生成的優(yōu)化后的文件就會放在/data/dalvik-cache下面喉前,同時optdex過程還會驗證字節(jié)碼没酣,同時向Android系統(tǒng)中注冊這個app,即Android會解析Android Manifest并向它自己的package.xml寫入對應的注冊信息
- 對于Dalvik卵迂,會把dex從apk文件內(nèi)提取出來放到某個文件夾下裕便,這樣每次啟動的時候就減少了一個從apk提取dex文件的動作
- 對于ART(6.0),不會生成odex文件狭握,取而代之的是oat文件闪金,我們知道ART(6.0)在安裝的時候會花費更多的時間疯溺,這個時間是干嘛用的呢论颅?其實就是用來從apk里面提取出來dex之后,把dex轉(zhuǎn)化成機器碼囱嫩,這樣得以讓設備直接執(zhí)行恃疯,也就是說不再執(zhí)行字節(jié)碼了
- 那是不是意味著ART就沒用了?都可以直接執(zhí)行機器嗎了墨闲,還用啥虛擬機今妄?
- 其實ART主要的作用就是用來創(chuàng)建對象和GC,就相當于ART充當了操作系統(tǒng)進程里堆的管理者鸳碧,實現(xiàn)了一種垃圾收集機制和堆內(nèi)存管理機制(包括分配內(nèi)存盾鳞、整理內(nèi)存碎片)
- 對于ART(7.0),不會把dex直接變成oat文件了瞻离,即不采用AOT的方法腾仅,也不是單純的JIT,而是說把OAT和JIT結(jié)合起來套利,當執(zhí)行了JIT后推励,會把它產(chǎn)生的機器碼保存下來,這樣既保證了安裝速度肉迫,又讓app越用越快
- aot文件里面不僅僅包含可執(zhí)行文件验辞,還包含了原來的dex文件和資源文件等文件,所以占用的空間更大喊衫,aot同樣也是放在某個緩存文件夾下面的跌造,在啟動某一個Android進程時都是去相應的文件夾下去load對應的odex / oat文件