轉載:http://www.jizhuomi.com/android/environment/463.html
在做Android內核開發(fā)的過程中绘梦,我們會發(fā)現蔼水,每次編譯完系統源碼,燒錄到設備/手機中后刻帚,第一次啟動都會很慢很慢拜效,要好幾分鐘甚至十幾分鐘,為什么會出現這樣的現象呢浓恶?系統刷機后第一次啟動與后面再次啟動有什么不同呢?
要解答這個問題结笨,首先我們需要了解一下Android?Dalvik虛擬機包晰,以及Dalvik-cache。
? ? ? ?由于嵌入式設備內存有限炕吸、CPU處理器不夠強大伐憾、功耗敏感等原因,Google沒有使用標準的JVM虛擬機赫模,而是為Android單獨開發(fā)了Dalvik虛擬機树肃。
Dalvik虛擬機與JVM虛擬機有很大不同,它運行的是經過優(yōu)化和壓縮的DEX字節(jié)碼瀑罗,與標準的JAR字節(jié)碼并不一樣胸嘴,占用空間更小,而且還可以進一步優(yōu)化斩祭,Android SDK中專門提供了dx工具把傳統的Java字節(jié)碼轉換為Dalvik虛擬機可以運行的DEX字節(jié)碼劣像,這個轉換過程是在程序編譯的時候就完成了,這就是為什么我們可以用Java來編寫能運行于Android Dalvik虛擬機的程序的原因了摧玫。關于這個過程耳奕,下面這張示意圖比較直觀:
? ? ? ?為了便于傳播,Android SDK將程序編譯后的DEX字節(jié)碼文件席赂、資源文件吮铭、lib庫时迫、AndroidManifest.xml等文件一起打包壓縮為apk文件(其實就是一個zip壓縮文件)颅停,因此,apk的安裝與卸載其實就是對這個zip壓縮包里面的文件進行解壓分析拷貝和優(yōu)化的過程掠拳。
由于DEX字節(jié)碼位于apk壓縮包中癞揉,因此,如果程序啟動的時候,每次都要從apk文件中解壓提取DEX字節(jié)碼喊熟,明顯效率不高柏肪,因此,Android系統設計了如下策略:
? ? ? ?(1) 創(chuàng)建一個"dalvik-cache"文件夾芥牌,專門存放DEX字節(jié)碼烦味,具體位于/data/dalvik-cache
? ? ? ?(2) 系統第一次啟動時,掃描所有的預裝apk文件壁拉,提取程序的DEX字節(jié)碼谬俄,經過優(yōu)化后,存放到dalvik-cache目錄中
? ? ? ?(3) 每次安裝新的apk的時候弃理,也同樣提取DEX字節(jié)碼溃论,優(yōu)化后放入dalvik-cache目錄中
? ? ? ?(4) 用戶點擊應用圖標后,直接從dalvik-cache目錄中快速加載優(yōu)化過的DEX字節(jié)碼痘昌,這樣程序就可以很快的啟動了钥勋。
? ? ? ?理解了上述原理,本文探討的問題也就迎刃而解了辆苔,Android系統刷機后第一次啟動時算灸,需要掃描所有預裝的apk文件,提取dex字節(jié)碼驻啤,優(yōu)化并且拷貝到/data/dalvik-cache緩存目錄中乎婿,因此,第一次啟動耗時會明顯更高街佑。