Dalvik虛擬機器

Dalvik虛擬機器,是Google等廠商合作開發的Android行動裝置平台的核心組成部分之一。它可以支援已轉換為.dex(即「Dalvik Executable」)格式的Java應用程式的執行。.dex格式是專為Dalvik設計的一種壓縮格式,適合主記憶體處理器速度有限的系統。Dalvik由Dan Bornstein編寫的,名字來源於他的祖先曾經居住過的小漁村達爾維克Dalvík),位於冰島埃亞峽灣

Dalvik
原作者Dan Bornstein
原始碼庫 編輯維基數據鏈結
作業系統Linux
平台Android
類型虛擬機器
許可協定Apache License 2.0
網站https://source.android.com/devices/tech/dalvik/index.html
Dalvik執行檔案
副檔名
.dex

大多數虛擬機器包括JVM都是一種堆疊機器,而Dalvik虛擬機器則是暫存器機。兩種架構各有優劣,一般而言,基於堆疊的機器需要更多指令,而基於暫存器的機器指令更長。

Android 5.0版起,Android Runtime(ART)取代Dalvik成為系統內預設虛擬機。

架構

dx工具是一種用來轉換Java class成為DEX格式的工具。多個類被包含在一個dex檔案之中。各個類中重複的字串和其他常數只在DEX中存放一次,以節省空間。Java位元組碼(bytecode)被轉換成Dalvik虛擬機所使用的替代指令集。一個未壓縮dex檔案通常稍小於一個已經壓縮的.jar檔。

安裝到行動裝置之時,Dalvik可執行檔可能會被修改。為了獲得進一步最佳化,虛擬機器可能會調整檔案內部分資料的端序行內一些函式和簡單的結構體、並短路掉一些不必要的操作。

當Android啟動時,Dalvik VM監視所有的程式(APK),並且建立依存關係樹,為每個程式最佳化代碼並儲存在Dalvik快取中。Dalvik第一次載入後會生成Cache檔案,以提供下次快速載入,所以第一次會很慢。

Dalvik直譯器採用預先算好的Goto位址,每個指令對主記憶體的訪問都在64位元組邊界上對齊。這樣可以節省一個指令後進行查表的時間。為了強化功能, Dalvik還提供了快速翻譯器(Fast Interpreter)。[來源請求]

dx

dx是一套工具,可以將Java .class轉換成.dex格式。一個dex檔通常會有多個.class。由於dex有時必須進行最佳化,會使檔案大小增加1-4倍,以ODEX結尾。

差異

  • Dalvik虛擬機器早期並沒有使用即時編譯(JIT)技術。從Android 2.2開始,Dalvik虛擬機器也支援JIT。
  • Dalvik虛擬機器有自己的位元組碼,並非使用Java位元組碼。
  • Dalvik基於暫存器,而JVM基於堆疊。
  • Dalvik VM透過Zygote進行類別的預載入,Zygote會完成虛擬機器的初始化,也是與JVM不同之處。

參考資料