編輯:Android開發環境
Dalvik是Android系統中另一個重要的部分,包括虛擬機和一組重要的運行環境。它的設計非常巧妙,是個很好的一個手機終端的底層應用。本文就簡單介紹Dalvik相關的15個問題。
1、大部分jvm是基於棧的,而Dalvik是基於寄存器的。
基於棧的機器必須使用指令來載入棧上數據,或是用指令來操縱數據,因此指令集更為龐大。但是對於寄存器指令而言,又必須指定源地址和目的地址,因此,基於寄存器的jvm單個指令更大。
2、Dalvik一些特點:
a)常量池32位索引
b)默認棧12kb,3個頁,每頁4kb
c)默認啟動堆2MB,最大值16MB,最小1MB
d)堆最大支持1024MB
e)堆和棧的參數可以通過-Xms和-Xmx更改
3、所有的android線程都對應一個linux線程。每個Android Dalvik應用程序都運行在自己的沙盒裡,不同的應用在不同的進程空間裡運行。
4、Dalvik相當於java的JVM,.NET的CLI,Python、Perl、Ruby的Interpreter。Dalvik定義自己的字節碼為VM的指令。
5、目前Dalvik支持的功能:
a).dex文件
b)Dalvik指令集
c)J2ME CLDC API
d)多線程
6、Dalvik支持的平台有:
a)基於Unix的系統
b)Linux
c)BSD
d)Mac OSX
7、Dalvik 虛擬機實現位於 dalvik/目錄下,dalvik/vm是虛擬機的實現部分,被編譯為libdvm.so,而dalvik/libdex被編譯成libdex.a靜態庫作為dex工具庫;dalvik/dexdump是.dex文件的反編譯工具。虛擬機的可執行程序位於dalvik/dalvikvm中,將被編譯為dalvikvm可執行程序。
8、Dalvik需要的其他庫:
a)OpenSSl 加密技術
b)Zlib 免費的一般目的數據壓縮庫
c)ICU 字符編碼技術
d)java包 包括java.nio,java.lang,java.util
e)Apache Harmony classlibApache HttpClient
9、Dalvik虛擬機的運行庫大部分是用可移植的C寫的,除了JNI call bridge。
10、Dalvik不遵循java SE和java ME的API規范,所以不支持AWT或者Swing。
11、dalvik/vm/Dvm.mk 中會根據dvm_arch來選擇編譯的目標集體系結構。
12、dx工具:位於dalvik/dx目錄,用於將字節碼轉換成.dex。
例:dx --dex --output=helloworld.dex helloworld.class
13、dexdump工具:位於dalvik/dexdump目錄,用於反編譯dex文件。
14、dex數據類型:
byte 8bit
ubyte 8bit
short 16bitlittle-endian
ushort 16bit little-endian
int 32bitlittle-endian
uint 32bitlittle-endian
long 64bitlittle-endian
ulong 64bitlittle-endian
sleb128 LEB128 variable-lengtha
uleb128 LEB128 variable-lengtha
uleb128p1 LEB128 variable-lengtha
LEB128類型:1~5個字節組成。所有字節組合在一起代表一個32位值。除最後一個字節最高標志位為0外,其他都為1,剩下的7位為有效負荷。有符號的LEB128的符號由最後一個字節的有效負荷最高位決定。具體算法在:dalvik/libdex/LEB128.h。
15、dex文件被映射到DexMapList,結構體定義在dalvik/libdex/DexFile.h(c) 中。