天天看點

【Android】一篇文章帶你了解 Android的 JIT 、AOT、Dalvik、ART ,不再傻傻分不清

為了解釋以上概念,我們得從Android 編譯過程說起。

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

    Java編譯器将應用中所有Java檔案編譯為class檔案,dx工具将應用編譯輸出的類檔案轉換為Dalvik位元組碼,即dex檔案之後經過簽名、對齊等操作變為APK檔案。

科普了概念之後,要開始聊一聊編譯打包的前世今生。

   在apk運作在手機上的時候,JAVA虛拟機需要将dex檔案轉換成機器能識别的的機器碼,如果每次執行一段代碼都執行這個過程,将dex轉換成機器能識别的語言的過程(微處理器指令),然後交給系統處理,這樣的效率不是很高。

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

   那麼什麼是JIT呢?JIT是"Just In Time Compiler"的縮寫,就是"即時編譯技術",與Dalvik虛拟機相關。當然,如果你的“這段代碼”被重複執行的次數非常少,那麼JIT的效果會不太明顯。

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

   JIT是在2.2版本提出的,目的是為了提高Android的運作速度,一直存活到4.4版本,因為在4.4之後兩種運作時環境共存(JIT 和 ANR),可以互相切換,但是在5.0+,Dalvik虛拟機則被徹底的丢棄,全部采用ART.

   ART是啥,為了便于大家的了解,可以先把它想象成Dalvik。AOT 可以了解成JIT的存在。

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

   推出AOT的其中原因之一是JIT即時編譯的缺陷。前面介紹過,JIT是運作時編譯,這樣可以對執行次數頻繁的dex代碼進行編譯和優化,減少以後使用時的翻譯時間,雖然可以加快Dalvik運作速度,但是還是有弊病,那就是将dex翻譯為本地機器碼也要占用時間,是以Google在4.4之後推出了ART,用來替換Dalvik。

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

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

(1)ART需要應用程式在安裝時,就把程式代碼轉換成機器語言,是以這會消耗掉更多的存儲空間,但消耗掉空間的增幅通常不會超過應用代碼包大小的20%

(2)由于有了一個轉碼的過程,是以應用安裝時間難免會延長

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