Dalvik虛擬機源碼解讀


Dalvik虛擬機的入口有兩個

1./Dalvikvm/Main.c

2.frameworks/base/cmds/app_process.cpp

這兩個文件中都包含main函數  用於創建第一個虛擬機實例  虛擬機作為一種應用程序,運行它是需要main函數的  其中app_peocess.cpp繼承了AndroidRuntime.cpp

/frameworks/base/core/jni/AndroidRuntime.cpp

第一個是用於開發用的,一般在x86上,開發調試時用。

第二個是手機等移動設備上用的。區別在於開發時要使用dx工具等,實際手機就是使用android操作系統,運行.apk文件,不需要再做編譯等工作。(.apk文件中包含的是.dex文件)

下面分析第二個入口的源碼:

手機開機的時候就創建一個虛擬機-->初始化這個虛擬機-->開始主線程-->一直運行下去  

調用的函數:startVm-->JNI_CreateJavaVM()-->start   start函數中調用findClass()和findMeth()進行執行 這個函數時不返回的 作為主線程 

start函數中會進入Zygote類,並且執行其main函數,函數中加載了Framework的類或者資源用於共享。還使用socket用於監聽,什么時候創建其他的虛擬機。Zygote就是一個孵化器,其他的虛擬機實例都是復制的他,同時共享了他的Framework的共享資源(這些資源都在同一個物理區域)。

Zygote進程復制的第一個虛擬機是Systemserver進程,此進程中有很多線程用於初始化系統服務。

Zygote是第一個虛擬機實例,當用戶運行其他應用程序的時候,系統會復制這個虛擬機,產生第二個虛擬機實例,可以很多個

大家知道一個虛擬機實例對應一個linux內核進程,系統啟動的時候,linux會創建一個系統進程,在這個進程中創建其他的進程,dalvik基於linux多進程就是這個意思。

在一個虛擬機實例里面有一個主線程,就是上面提到的start函數,這個主線程用於執mian函數。其他線程可以由用戶創建,也可以是系統自帶的,比如垃圾回收線程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM