Dalvik虛擬機
Dalvik虛擬機,是Google等廠商合作開發的Android移動設備平台的核心組成部分之一。它可以支持已轉換為.dex(即「Dalvik Executable」)格式的Java應用程序的運行。.dex格式是專為Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統。Dalvik由Dan Bornstein編寫的,名字來源於他的祖先曾經居住過的小漁村達爾維克(Dalvík),位於冰島埃亞峽灣。
原作者 | Dan Bornstein |
---|---|
源代碼庫 | |
操作系統 | Linux |
平台 | Android |
類型 | 虛擬機 |
許可協議 | Apache License 2.0 |
網站 | https://source.android.com/devices/tech/dalvik/index.html |
副檔名 |
.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不同之處。