1. 程式人生 > >Android 執行時: DVM vs ART

Android 執行時: DVM vs ART

在瞭解 Android 執行時之前,我們需要了解什麼是執行時環境以及一些基本概念,即 Java 虛擬機器(JVM)和 Dalvik 虛擬機器(DVM)的功能。

什麼是執行時?

簡單來說,執行時就是一個供作業系統使用的系統,它負責將你用高階語言(比如 Java)編寫的程式碼轉換成 CPU/處理器能夠理解的機器碼。

執行時由你的程式執行時所執行的指令構成,儘管本質上它們不屬於程式程式碼的任何一部分。

CPU (或者更通用的說法電腦)只能夠理解機器語言(二進位制程式碼),所以為了使程式能夠在 CPU 上執行,就必須將它們翻譯成機器碼,這一工作由翻譯器完成。

這裡按序列出歷代翻譯器:

1.彙編器

它直接將組合語言翻譯成機器碼,所以它的速度非常快。

2.編譯器

它將原始碼翻譯成組合語言,然後再用匯編器轉換成機器碼。這種方式編譯過程很慢但是執行速度很快。但是使用編譯器最大的問題是編譯出來的機器碼依賴於特定的平臺。換句話說,在一臺機器上可以執行的程式碼在另一臺不同的機器上可能就無法執行。

3.直譯器

它在執行程式時才翻譯程式碼。由於程式碼翻譯是在執行階段才發生,所以執行速度很慢。

JAVA 程式碼是怎麼執行的?

為了使程式碼和平臺無關,JAVA開發了 JVM,即 Java 虛擬機器。它為每一個平臺開發一個 JVM,也就意味著 JVM 是和平臺相關的。Java 編譯器將 .java 檔案轉換成 .class檔案,也就是位元組碼。最終將位元組碼提供給 JVM,由 JVM 將它轉換成機器碼。

這比直譯器要快但是比 C++ 編譯要慢。

Android 程式碼是怎麼執行的

在 Android 中,Java 類被轉換成 DEX 位元組碼。DEX 位元組碼通過 ART 或者 Dalvik runtime 轉換成機器碼。這裡 DEX 位元組碼和裝置架構無關。

Dalvik 是一個基於 JIT(Just in time)編譯的引擎。使用 Dalvik 存在一些缺點,所以從 Android 4.4(Kitkat)開始引入了 ART 作為執行時,從 Android 5.0(Lollipop)開始 ART 就全面取代了Dalvik。Android 7.0 向 ART 中添加了一個 just-in-time(JIT)編譯器,這樣就可以在應用執行時持續的提高其效能。

重點:Dalvik 使用 JIT(Just in time)編譯而 ART 使用 AOT(Ahead of time)編譯。

下圖描述了 Dalvik 虛擬機器和 Java 虛擬機器之間的差別。

Just In Time (JIT)

使用 Dalvik JIT 編譯器,每次應用在執行時,它實時的將一部分 Dalvik 位元組碼翻譯成機器碼。在程式的執行過程中,更多的程式碼被被編譯並快取。由於 JIT 只翻譯一部分程式碼,它消耗的更少的記憶體,佔用的更少的物理儲存空間。

Ahead Of Time(AOT)

ART 內建了一個 Ahead-of-Time 編譯器。在應用的安裝期間,他就將 DEX 位元組碼翻譯成機器碼並存儲在裝置的儲存器上。這個過程只在將應用安裝到裝置上時發生。由於不再需要 JIT 編譯,程式碼的執行速度要快得多。

由於 ART 直接執行的是應用的機器碼(native execution),它所佔用的 CPU 資源要少於 使用 JIT 編譯的 Dalvik。由於佔用較少的 CPU 資源也就消耗更少的電池資源。

ART 和 Dalvik 一樣使用的是相同的 DEX 位元組碼。編譯好的應用如果使用 ART 在安裝時需要額外的時間用於編譯,同時還需要更多的空間用於儲存編譯後的程式碼。

Android 為什麼要使用虛擬機器?

Android 使用虛擬機器作為其執行環境是為了執行 APK 檔案構成的 Android 應用。它的優點有:

  • 應用程式碼和核心的作業系統分離。所以即使任意一個程式中包含惡意的程式碼也不會直接影響系統檔案。這使得 Android 作業系統更穩定可靠。
  • 它提高了跨平臺相容性或者說平臺獨立性。這意味著即使某一個應用是在 PC 上編譯的,它也可以通過虛擬機器在移動平臺上執行。

ART 的優點

  • 應用執行更快,因為 DEX 位元組碼的翻譯在應用安裝是就已經完成。
  • 減少應用的啟動時間,因為直接執行的是 native 程式碼。
  • 提高裝置的續航能力,因為節約了用於一行一行解釋位元組碼所需要的電池。
  • 改善的垃圾回收器
  • 改善的開發者工具

ART 的缺點

  • 應用安裝需要更長的時間,因為 DEX 位元組碼需要在安裝時就翻譯成機器碼。
  • 由於在安裝時時生成的 native 機器碼是儲存在內部儲存器上,所以需要更多的內部儲存空間。

結論

DEX 是專門為 Android 設計的一種位元組碼格式,主要是為了消耗更少的記憶體進行優化。ART 是為了在低端裝置上執行多個虛擬機器而開發的,這一目的通過使用 DEX 位元組碼實現。它使得應用的 UI 反應更及時。這就是我個人的全部觀點。更多關於 ART 和 Dalvik 的細節可以參考Android 官方文件