在做Android內(nèi)核開發(fā)的過程中,我們會發(fā)現(xiàn)窥突,每次編譯完系統(tǒng)源碼努溃,燒錄到設備/手機中后,第一次啟動都會很慢很慢阻问,要好幾分鐘甚至十幾分鐘梧税,為什么會出現(xiàn)這樣的現(xiàn)象呢?系統(tǒng)刷機后第一次啟動與后面再次啟動有什么不同呢称近?
要解答這個問題第队,首先我們需要了解一下AndroidDalvik虛擬機,以及Dalvik-cache刨秆。
由于嵌入式設備內(nèi)存有限凳谦、CPU處理器不夠強大、功耗敏感等原因衡未,Google沒有使用標準的JVM虛擬機尸执,而是為Android單獨開發(fā)了Dalvik虛擬機。
Dalvik虛擬機與JVM虛擬機有很大不同缓醋,它運行的是經(jīng)過優(yōu)化和壓縮的DEX字節(jié)碼如失,與標準的JAR字節(jié)碼并不一樣,占用空間更小送粱,而且還可以進一步優(yōu)化褪贵,Android SDK中專門提供了dx工具把傳統(tǒng)的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系統(tǒng)設計了如下策略:
(1) 創(chuàng)建一個"dalvik-cache"文件夾效览,專門存放DEX字節(jié)碼,具體位于/data/dalvik-cache
(2) 系統(tǒng)第一次啟動時荡短,掃描所有的預裝apk文件丐枉,提取程序的DEX字節(jié)碼,經(jīng)過優(yōu)化后掘托,存放到dalvik-cache目錄中
(3) 每次安裝新的apk的時候瘦锹,也同樣提取DEX字節(jié)碼,優(yōu)化后放入dalvik-cache目錄中
(4) 用戶點擊應用圖標后闪盔,直接從dalvik-cache目錄中快速加載優(yōu)化過的DEX字節(jié)碼弯院,這樣程序就可以很快的啟動了。
理解了上述原理泪掀,本文探討的問題也就迎刃而解了抽兆,Android系統(tǒng)刷機后第一次開機啟動時,需要掃描所有預裝的apk文件族淮,提取dex字節(jié)碼辫红,優(yōu)化并且拷貝到/data/dalvik-cache緩存目錄中,因此祝辣,第一次啟動耗時會明顯更高贴妻。
美文推薦:
技術博客:針對移動應用加密的問題,如何加密.DEX文件呢蝙斜?
技術博客:如何防二次打包,愛加密加固APK防破解