天天看點

Android 虛拟機—Dalvik&ART

Dalvik 虛拟機與ART 虛拟機

Dalvik是什麼?

Dalvik 是實作了 JVM 規範的虛拟機,内部預設使用的 CMS 垃圾回收器。但是與 JVM 不一樣的是 JMM 運作的 .class 位元組碼,而 Dalvik 運作的 dex 檔案。dex 全稱 Dalvik Executable Format ,是一種專門為 Dalvik 設計的一種壓縮格式,dex 是由很多 class 壓縮後的檔案。并且 JVM 是基于棧結構的,而 DVM 是基于寄存器的,是以 DVM 更适合記憶體和處理器速度有限的系統。

ART是什麼?

全稱為 Android Runtime ,是 Android 4.4 引入的一個開發者選項,在 Android 5.0 之後預設使用的是 ART 虛拟機。ART 是可以相容運作 Dex 位元組碼,在應用安裝的時候 Ahead-Of-Time(AOT) 預編譯位元組碼到機器語言,應用程式安裝會變慢,但是執行将更有效率,啟動更快。

Dalvik 與 ART 的差別

  • 預編譯
在Dalvik下,應用運作需要解釋執行,運作效率低。為了提高執行效率,常用熱點代碼通過即時編譯器(JIT)将位元組碼轉換為機器碼,避免重複解析執行。而在ART 環境中,應用在安裝時,位元組碼預編譯(AOT)成機器碼,安裝慢了,但運作效率會提高。
  • 回收算法
Dalvik 固定一種回收算法CMS,這種算法的缺點是CMS回收器采用的基礎算法是Mark-Sweep,CMS不會整理、壓縮堆空間,這樣就會有一個問題:經過CMS收集的堆會産生空間碎片。而 ART 回收算法可在運作期間選擇,并且 ART 具備記憶體整理能力,減少記憶體空洞。
  • 占用空間
ART占用空間比Dalvik大(位元組碼變為機器碼), “空間換時間"。
  • 降低能耗
預編譯也可以明顯改善電池續航,因為應用程式每次運作時不用重複編譯了,進而減少了 CPU 的使用頻率,降低了能耗

dexopt與dexaot

dexopt

在Dalvik中虛拟機在加載一個dex檔案時,對 dex 檔案 進行 驗證 和 優化的操作,其對 dex 檔案的優化結果變成了 odex(Optimized dex) 檔案,這個檔案和 dex 檔案很像,隻是使用了一些優化操作碼。

在 BaseDexClassLoader 中的構造函數的中 optimizedDirectory 存放的就是經過 dexopt 之後的 odex 檔案。

public BaseDexClassLoader(String dexPath, File optimizedDirectory, String librarySearchPath, ClassLoader parent) {
    ...
}
           

dexaot

在安裝時對 dex 檔案執行

dexopt

(Optimized Dex)優化之後得到

odex

,再将

odex

進行 AOT 提前編譯操作,編譯為OAT(實際上是ELF檔案)可執行檔案(機器碼)。(相比做過ODEX優化,未做過優化的DEX轉換成OAT要花費更長的時間)

Dex 到 OAT 的過程

Android 虛拟機—Dalvik&ART

參考

  • https://source.android.google.cn/devices/tech/dalvik/

本文是筆者學習之後的總結,友善日後檢視學習,有任何不對的地方請指正。

記錄于 2019年4月16号