在作Android內核開發的過程當中,咱們會發現,每次編譯完系統源碼,燒錄到設備/手機中後,第一次啓動都會很慢很慢,要好幾分鐘甚至十幾分鍾,爲何會出現這樣的現象呢?系統刷機後第一次啓動與後面再次啓動有什麼不一樣呢?html
要解答這個問題,首先咱們須要瞭解一下Android Dalvik虛擬機,以及Dalvik-cache。java
因爲嵌入式設備內存有限、CPU處理器不夠強大、功耗敏感等緣由,Google沒有使用標準的JVM虛擬機,而是爲Android單獨開發了Dalvik虛擬機。android
Dalvik虛擬機與JVM虛擬機有很大不一樣,它運行的是通過優化和壓縮的DEX字節碼,與標準的JAR字節碼並不同,佔用空間更小,並且還能夠進一步優化,Android SDK中專門提供了dx工具把傳統的Java字節碼轉換爲Dalvik虛擬機能夠運行的DEX字節碼,這個轉換過程是在程序編譯的時候就完成了,這就是爲何咱們能夠用Java來編寫能運行於Android Dalvik虛擬機的程序的緣由了。關於這個過程,下面這張示意圖比較直觀:緩存
爲了便於傳播,Android SDK將程序編譯後的DEX字節碼文件、資源文件、lib庫、AndroidManifest.xml等文件一塊兒打包壓縮爲apk文件(其實就是一個zip壓縮文件),所以,apk的安裝與卸載其實就是對這個zip壓縮包裏面的文件進行解壓分析拷貝和優化的過程。微信
因爲DEX字節碼位於apk壓縮包中,所以,若是程序啓動的時候,每次都要從apk文件中解壓提取DEX字節碼,明顯效率不高,所以,Android系統設計了以下策略:工具
(1) 建立一個"dalvik-cache"文件夾,專門存放DEX字節碼,具體位於/data/dalvik-cache學習
(2) 系統第一次啓動時,掃描全部的預裝apk文件,提取程序的DEX字節碼,通過優化後,存放到dalvik-cache目錄中優化
(3) 每次安裝新的apk的時候,也一樣提取DEX字節碼,優化後放入dalvik-cache目錄中.net
(4) 用戶點擊應用圖標後,直接從dalvik-cache目錄中快速加載優化過的DEX字節碼,這樣程序就能夠很快的啓動了。設計
理解了上述原理,本文探討的問題也就迎刃而解了,Android系統刷機後第一次啓動時,須要掃描全部預裝的apk文件,提取dex字節碼,優化而且拷貝到/data/dalvik-cache緩存目錄中,所以,第一次啓動耗時會明顯更高。
擴展閱讀: 《Dalvik Optimization and Verification With dexopt》
關於Android系統刷機後第一次啓動的特色就簡單介紹到這裏了,有任何疑問或者建議歡迎留言或者來信lujun.hust@gmail.com交流
結束語
免費學習更多精品課程,登陸樂搏學院官網http://h.learnbo.cn/
或關注咱們的官方微博微信,還有更多驚喜哦~
本文出自 「Jhuster的專欄」 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/1677216