自 2008 年 9 月 23 日對外發布第一個版本 Android 1.0 以來,在摩爾定律和安迪比爾定律的共同做用下,Android 系統以每一年至少一次重大更新(2016 年至今每一年一次)速度進行迭代,在進行版本迭代的過程當中,Android 虛擬機的發展不可忽視。android
在 Android 系統初期,不一樣於 Java 平臺使用 JVM 加載字節碼文件(.class),Android 系統由 Dalvik 擔任虛擬機的角色,每次運行程序的時候,Dalvik 負責加載 dex/odex 文件並解析成機器碼交由系統調用。函數
爲了適應硬件速度的提高,Android 系統系統也在不斷更新,單一的 Dalvik 虛擬機已經漸漸地知足系統的要求了,2010 年 5 月 20 日,Google 發佈 Android 2.2(Froyo凍酸奶),在這個版本中,Google 在 Android 虛擬中加入了 JIT 編譯器(Just-In-Time Compiler)。性能
和其餘大多數 JVM 同樣,Dalvik 使用 JIT 進行即時編譯,藉助 Java HotSpot VM,JIT 編譯器能夠對執行次數頻繁的 dex/odex 代碼進行編譯與優化,將 dex/odex 中的 Dalvik Code(Smali 指令集)翻譯成至關精簡的 Native Code 去執行,JIT 的引入使得 Dalvik 的性能提高了 3~6 倍。優化
可是 JIT 模式的缺點也不容忽視:翻譯
2013 年 10 月 31 日,Google 發佈 Android 4.4(奇巧Kitkat),帶來了全新的虛擬機運行環境 ART(Android RunTime)的預覽版和全新的編譯策略 AOT(Ahead-of-time),須要注意的是,彼時 ART 是和 Dalvik 共存的,用戶能夠在二者之間進行選擇(感受怪怪的,用戶但是小透明啊)。3d
2014 年 10 月 16 日,Google 發佈 Android 5.0(棒棒糖Lollipop),ART 全面取代 Dalvik 成爲 Android 虛擬機運行環境,至此,Dalvik 退出歷史舞臺,AOT 也成爲惟一的編譯模式。code
AOT 和 JIT 的不一樣之處在於:JIT 是在運行時進行編譯,是動態編譯,而且每次運行程序的時候都須要對 odex 從新進行編譯;而 AOT 是靜態編譯,應用在安裝的時候會啓動 dex2oat 過程把 dex 預編譯成 ELF 文件,每次運行程序的時候不用從新編譯,是真正意義上的本地應用。cdn
另外,相比於 Dalvik,ART 對 Garbage Collection(GC)過程的也進行了改進:視頻
AOT 模式解決了應用啓動和運行速度和耗電問題的同時也帶來了另外兩個問題:對象
這也給 Android 系統後續的優化埋下了伏筆。
用過 Android 手機的人應該都知道,在 Android 5.x 和 6.x 的機器上,系統每次 OTA 升級完成重啓的時候都會有個應用優化的過程,這個過程就是剛纔所說的 dex2oat 過程,這個過程比較耗時而且會佔用額外的存儲空間。
2016 年 8 月 22 日,Google 發佈 Android 7.0(牛軋糖Nougat),JIT 編譯器迴歸,造成 AOT/JIT 混合編譯模式,這種混合編譯模式的特色是:
能夠看出,混合編譯模式綜合了 AOT 和 JIT 的各類優勢,使得應用在安裝速度加快的同時,運行速度、存儲空間和耗電量等指標都獲得了優化。
Android 系統從誕生到如今,經歷了幾回重要更新,最終選擇了折衷的方案,使得系統的安裝和運行的時候各項指標都獲得了優化,至此,Android 虛擬機的發展進程告一段落。可是,隨着硬件性能的不斷提高,相信谷歌的腳步不會就此中止,期待谷歌能在將來給咱們不斷帶來驚喜。
source.android.com/devices/tec…
若是你對文章內容有不一樣意見,歡迎留言,咱們一同探討。