ART、JIT、AOT、Dalvik之間有什么關系?
Dalvik與ART的區別
- 什么是Dalvik?
Dalvik是Google公司自己設計用于Android平臺的虛擬機。Dalvik虛擬機是Google等廠商合作開發的Android移動設備平臺的核心組成部分之一。它可以支持已轉換為 .dex格式的Java應用程序的運行,.dex格式是專 為Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統。Dalvik 經過優化,允許在有限的內存中同時運行多個虛擬機的實例,并且每一個Dalvik 應用作為一個獨立的Linux 進程執行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。
- 什么是ART?
即Android Runtime, ART 的機制與 Dalvik 不同。在Dalvik下,應用每次運行的時候,字節碼都需要通過即時編譯器(just in time ,JIT)轉換為機器碼,這會拖慢應用的運行效率,而在ART 環境中,應用在第一次安裝的時候,字節碼就會預先編譯成機器碼,使其成為真正的本地應用。這個過程叫做預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啟動(首次)和執行都會變得更加快速。
-
Dalvik與ART區別
dalvik是執行的時候編譯+運行,安裝比較快,開啟應用比較慢,應用占用空間小
-
ART是安裝的時候就編譯好了,執行的時候直接就可以運行的,安裝慢,開啟應用快,占用空間大
用個比喻來說就是,騎自行車
dalvik 是已經折疊起來的自行車,每次騎都要先組裝自行車才能騎
ART 是已經組裝好的自行車,每次騎直接上車就能走人。
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