Dalvik虛擬機器是google專門為android平台開發的一個java虛擬機器,但它並沒有使用JVM規範。Dalvik虛擬機器主要完成對象生命週期的管理、線程管理、安全和異常管理以及記憶體回收等重要功能。
java虛擬機器和Dalvik虛擬機器的區別:
| |
java虛擬機器 |
Dalvik虛擬機器 |
| |
java虛擬機器基於棧。 基於棧的機器必須使用指令來載入和操作棧上資料,所需指令更多更多 |
dalvik虛擬機器是基於寄存器的 |
| |
java虛擬機器啟動並執行是java位元組碼。(java類會被編譯成一個或多個位元組碼.class檔案,打包到.jar檔案中,java虛擬機器從相應的.class檔案和.jar檔案中擷取相應的位元組碼) |
Dalvik啟動並執行是自訂的.dex位元組碼格式。(java類被編譯成.class檔案後,會通過一個dx工具將所有的.class檔案轉換成一個.dex檔案,然後dalvik虛擬機器會從其中讀取指令和資料) |
| |
|
常量池已被修改為只使用32位的索引,以 簡化解譯器。dalvik的堆和棧的參數可以通過-Xms和-Xmx更改 |
| |
|
一個應用,一個虛擬機器執行個體,一個進程(所有android應用的線程都是對應一個linux線程,都運行在自己的沙箱中,不同的應用在不同的進程中運行。每個android dalvik應用程式都被賦予了一個獨立的linux PID(app_*)) |
Dalvik虛擬機器架構:
在android源碼中,Dalvik虛擬機器的實現位於“dalvik/”目錄下,其中“dalvik/vm”是虛擬機器的實現部分,將會編譯成libdvm.so;而"dalvik/libdex"將會編譯成libdex.a靜態庫作為dex工具;“dalvik/dexdump”是.dex檔案的反編譯工具;虛擬機器的可執行程式位於“dalvik/dalvikvm”中,將會編譯成dalvikvm可執行檔。
dalvik虛擬機器架構:
Android應用編譯及運行流程:
Dalvik進程管理:
dalvik進程管理是依賴於linux的進程體繫結構的,如要為應用程式建立一個進程,它會使用linux的fork機制來複製一個進程(複製進程往往比建立進程效率更高)。
Zygote是一個虛擬機器進程,同時也是一個虛擬機器執行個體的孵化器,它通過init進程啟動。首先會孵化出System_Server(android絕大多系統服務的守護進程,它會監聽socket等待請求命令,當有一個應用程式啟動時,就會向它發出請求,zygote就會FORK出一個新的應用程式進程).每當系統要求執行一個android應用程式時,Zygote就會運用linux的FORK進位產生一個子進程來執行該應用程式。
JVM和Dalvik進程管理的區別:
........
linux中處理序間通訊的方式有很多,但是dalvik使用的是訊號方式來完成處理序間通訊。
最後,介紹下android的初始化流程圖
Android的初始化流程: