Dalvik 和 ART 虛擬機有什麼區別?回顧 Android 虛擬機的發展史

2019-09-10     Fronit

2008年9月22日,谷歌正式對外發布第一款 Android 手機——HTC G1。9月23日,谷歌發布Android 1.0。在此後的10多年時間內,Android 系統不斷疊代更新,至此已經來到了 Android 10 時代,其 Android 虛擬機也變得不斷成熟和高效。

早期 Android 虛擬機

在 Android 系統初期,不同於 Java 平台使用 JVM 加載位元組碼文件(.class文件),Android 系統由 Dalvik 擔任虛擬機的角色。.dex 文件是 Dalvik 虛擬機的可執行文件,每次運行程序的時候,Dalvik 負責加載 dex/odex 文件並解析成機器碼交由系統調用。

Android 2.2 —— JIT 首次登場

為了適應硬體速度的提升,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 模式的缺點也不容忽視:

  • 每次啟動應用都需要重新編譯
  • 運行時比較耗電,造成電池額外的開銷

Andorid 4.4 —— ART 和 Dalvik 並存

2013年9月,Google 發布 Android 4.4(Kitkat),帶來了全新的虛擬機運行環境 ART(Android RunTime)的預覽版和全新的編譯策略 AOT(Ahead of Time),需要注意的是,彼時 ART 是和 Dalvik 共存的,除了默認的Dalvik模式,還支持ART模式。用戶可以在兩者之間進行選擇。

Android 5.0 —— ART 全面取代 Dalvik

2014年10月,Google 發布 Android 5.0(Lollipop),ART 全面取代 Dalvik 成為 Android 虛擬機運行環境,至此,Dalvik 退出歷史舞台,AOT 也成為唯一的編譯模式。

AOT 和 JIT 的不同之處在於:JIT 是在運行時進行編譯,是動態編譯,並且每次運行程序的時候都需要對 odex 重新進行編譯;而 AOT 是靜態編譯,應用在安裝的時候會啟動 dex2oat 過程把 dex 預編譯成 ELF 文件,每次運行程序的時候不用重新編譯,是真正意義上的本地應用。

Android 7.0 —— JIT 回歸

用過 Android 手機的人應該都知道,在 Android 5.x 和 6.x 的機器上,系統每次 OTA 升級完成重啟的時候都會有個應用優化的過程,這個過程就是剛才所說的 dex2oat 過程,這個過程比較耗時並且會占用額外的存儲空間。

2016 年 8 月,Google 發布 Android 7.0(Nougat),JIT 編譯器回歸,形成 AOT/JIT 混合編譯模式,這種混合編譯模式的特點是:

  • 應用在安裝的時候 dex 不會被編譯
  • 應用在運行時 dex 文件先通過解析器後會被直接執行(這一步驟跟 Android 2.2 - 4.4之前的行為一致),與此同時,熱點函數(Hot Code)會被識別並被 JIT 編譯後存儲在 jit code cache 中並生成 profile 文件以記錄熱點函數的信息。
  • 手機進入 IDLE(空閒) 或者 Charging(充電) 狀態的時候,系統會掃描 App 目錄下的 profile 文件並執行 AOT 過程進行編譯。

混合編譯模式綜合了 AOT 和 JIT 的各種優點,使得應用在安裝速度加快的同時,運行速度、存儲空間和耗電量等指標都得到了優化。

結語

Android 系統從從誕生到現在,系統經歷了多次重大更新, Android 虛擬機也在不斷進化,如今的混合編譯模式是綜合了多方面的考慮,在時間、空間和性能之間找到了一個平衡點。相信隨著硬體性能的提升和軟體架構的發展,谷歌變革的腳步不會停止,優秀的下一代 Android 虛擬機也許馬上就會到來。

文章來源: https://twgreatdaily.com/zh-cn/iaP6JW0BJleJMoPMBduz.html