1. 程式人生 > >ART、JIT、AOT、Dalvik之間有什麼關係?

ART、JIT、AOT、Dalvik之間有什麼關係?

JIT與Dalvik

JIT是"Just In Time Compiler"的縮寫,就是"即時編譯技術",與Dalvik虛擬機器相關。

怎麼理解這句話呢?這要從Android的一些特性說起。

JIT是在2.2版本提出的,目的是為了提高Android的執行速度,一直存活到4.4版本,因為在4.4之後的ROM中,就不存在Dalvik虛擬機器了。

我們使用Java開發android,在編譯打包APK檔案時,會經過以下流程

  • Java編譯器將應用中所有Java檔案編譯為class檔案
  • dx工具將應用編譯輸出的類檔案轉換為Dalvik位元組碼,即dex檔案

之後經過簽名、對齊等操作變為APK檔案。

Dalvik虛擬機器可以看做是一個Java VM,他負責解釋dex檔案為機器碼,如果我們不做處理的話,每次執行程式碼,都需要Dalvik將dex程式碼翻譯為微處理器指令,然後交給系統處理,這樣效率不高。

為了解決這個問題,Google在2.2版本添加了JIT編譯器,當App執行時,每當遇到一個新類,JIT編譯器就會對這個類進行編譯,經過編譯後的程式碼,會被優化成相當精簡的原生型指令碼(即native code),這樣在下次執行到相同邏輯的時候,速度就會更快。

當然使用JIT也不一定加快執行速度,如果大部分程式碼的執行次數很少,那麼編譯花費的時間不一定少於執行dex的時間。Google當然也知道這一點,所以JIT不對所有dex程式碼進行編譯,而是隻編譯執行次數較多的dex為本地機器碼。

有一點需要注意,那就是dex位元組碼翻譯成本地機器碼是發生在應用程式的執行過程中的,並且應用程式每一次重新執行的時候,都要做重做這個翻譯工作,所以這個工作並不是一勞永逸,每次重新開啟App,都需要JIT編譯。

另外,Dalvik虛擬機器從Android一出生一直活到4.4版本,而JIT在Android剛釋出的時候並不存在,在2.2之後才被新增到Dalvik中。

ART與AOT

AOT是"Ahead Of Time"的縮寫,指的就是ART(Anroid RunTime)這種執行方式。

前面介紹過,JIT是執行時編譯,這樣可以對執行次數頻繁的dex程式碼進行編譯和優化,減少以後使用時的翻譯時間,雖然可以加快Dalvik執行速度,但是還是有弊病,那就是將dex翻譯為本地機器碼也要佔用時間,所以Google在4.4之後推出了ART,用來替換Dalvik。

在4.4版本上,兩種執行時環境共存,可以相互切換,但是在5.0+,Dalvik虛擬機器則被徹底的丟棄,全部採用ART。

ART的策略與Dalvik不同,在ART 環境中,應用在第一次安裝的時候,位元組碼就會預先編譯成機器碼,使其成為真正的本地應用。之後開啟App的時候,不需要額外的翻譯工作,直接使用本地機器碼執行,因此執行速度提高。

當然ART與Dalvik相比,還是有缺點的。

  • ART需要應用程式在安裝時,就把程式程式碼轉換成機器語言,所以這會消耗掉更多的儲存空間,但消耗掉空間的增幅通常不會超過應用程式碼包大小的20%
  • 由於有了一個轉碼的過程,所以應用安裝時間難免會延長

但是這些與更流暢的Android體驗相比而言,不值一提。

總結

通過前面背景知識的介紹,我終於可以更簡單的介紹這四個名詞之間的關係了:

  • JIT代表執行時編譯策略,也可以理解成一種執行時編譯器,是為了加快Dalvik虛擬機器解釋dex速度提出的一種技術方案,來快取頻繁使用的本地機器碼
  • ART和Dalvik都算是一種Android執行時環境,或者叫做虛擬機器,用來解釋dex型別檔案。但是ART是安裝時解釋,Dalvik是執行時解釋
  • AOT可以理解為一種編譯策略,即執行前編譯,ART虛擬機器的主要特徵就是AOT