2008年9月22日,谷歌正式對外發布第一款 Android 手機——HTC G1。9月23日,谷歌發布Android 1.0。在此後的10多年時間內,Android 系統不斷疊代更新,至此已經來到了 Android 10 時代,其 Android 虛擬機也變得不斷成熟和高效。
在 Android 系統初期,不同於 Java 平台使用 JVM 加載位元組碼文件(.class文件),Android 系統由 Dalvik 擔任虛擬機的角色。.dex 文件是 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年9月,Google 發布 Android 4.4(Kitkat),帶來了全新的虛擬機運行環境 ART(Android RunTime)的預覽版和全新的編譯策略 AOT(Ahead of Time),需要注意的是,彼時 ART 是和 Dalvik 共存的,除了默認的Dalvik模式,還支持ART模式。用戶可以在兩者之間進行選擇。
2014年10月,Google 發布 Android 5.0(Lollipop),ART 全面取代 Dalvik 成為 Android 虛擬機運行環境,至此,Dalvik 退出歷史舞台,AOT 也成為唯一的編譯模式。
AOT 和 JIT 的不同之處在於:JIT 是在運行時進行編譯,是動態編譯,並且每次運行程序的時候都需要對 odex 重新進行編譯;而 AOT 是靜態編譯,應用在安裝的時候會啟動 dex2oat 過程把 dex 預編譯成 ELF 文件,每次運行程序的時候不用重新編譯,是真正意義上的本地應用。
用過 Android 手機的人應該都知道,在 Android 5.x 和 6.x 的機器上,系統每次 OTA 升級完成重啟的時候都會有個應用優化的過程,這個過程就是剛才所說的 dex2oat 過程,這個過程比較耗時並且會占用額外的存儲空間。
2016 年 8 月,Google 發布 Android 7.0(Nougat),JIT 編譯器回歸,形成 AOT/JIT 混合編譯模式,這種混合編譯模式的特點是:
混合編譯模式綜合了 AOT 和 JIT 的各種優點,使得應用在安裝速度加快的同時,運行速度、存儲空間和耗電量等指標都得到了優化。
結語
Android 系統從從誕生到現在,系統經歷了多次重大更新, Android 虛擬機也在不斷進化,如今的混合編譯模式是綜合了多方面的考慮,在時間、空間和性能之間找到了一個平衡點。相信隨著硬體性能的提升和軟體架構的發展,谷歌變革的腳步不會停止,優秀的下一代 Android 虛擬機也許馬上就會到來。