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函數。其他線程可以由用戶創建,也可以是系統自帶的,比如垃圾回收線程。