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

JIT與Dalvikandroid

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文件。code

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
相關文章
相關標籤/搜索