dex
- 關于dex先說幾點,我們知道java生成的是class文件,jvm也是基于棧的虛擬機,而Dalvik和ART都是基于寄存器的虛擬機,所以在build的時候,不僅僅是簡單合并和去除重復,還要轉變指令和數(shù)據(jù)結構
apk
- apk實質上就是一個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文件內提取出來放到某個文件夾下,這樣每次啟動的時候就減少了一個從apk提取dex文件的動作
- 對于ART(6.0),不會生成odex文件,取而代之的是oat文件,我們知道ART(6.0)在安裝的時候會花費更多的時間,這個時間是干嘛用的呢?其實就是用來從apk里面提取出來dex之后,把dex轉化成機器碼,這樣得以讓設備直接執(zhí)行,也就是說不再執(zhí)行字節(jié)碼了
- 那是不是意味著ART就沒用了?都可以直接執(zhí)行機器嗎了,還用啥虛擬機?
- 其實ART主要的作用就是用來創(chuàng)建對象和GC,就相當于ART充當了操作系統(tǒng)進程里堆的管理者,實現(xiàn)了一種垃圾收集機制和堆內存管理機制(包括分配內存、整理內存碎片)
- 對于ART(7.0),不會把dex直接變成oat文件了,即不采用AOT的方法,也不是單純的JIT,而是說把OAT和JIT結合起來,當執(zhí)行了JIT后,會把它產(chǎn)生的機器碼保存下來,這樣既保證了安裝速度,又讓app越用越快
- aot文件里面不僅僅包含可執(zhí)行文件,還包含了原來的dex文件和資源文件等文件,所以占用的空間更大,aot同樣也是放在某個緩存文件夾下面的,在啟動某一個Android進程時都是去相應的文件夾下去load對應的odex / oat文件