Android啟動(dòng)的第一個(gè)虛擬機(jī)稱為Zygote,這也是Android中重要的一個(gè)虛擬機(jī)。在system\core\rootdir\init.rc腳本中,Zygote的啟動(dòng)配置如下:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
--start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
Zygote進(jìn)程的啟動(dòng)過(guò)程位于frameworks\base\cmds\app_process\app_main.cpp文件中,app_main.cpp中描述了應(yīng)用進(jìn)程(app_process)的啟動(dòng)模式:zygote模式和非zygote模式。應(yīng)用進(jìn)程的命令行參數(shù)為:
app_process [java-options] cmd-dir start-class-name [options]
由此可以明白,在啟動(dòng)Zygote進(jìn)程時(shí),app_process的java-options選項(xiàng)為-Xzygote;cmd-dir選項(xiàng)為/system/bin,即當(dāng)前目錄;start-class-name為zygote,即進(jìn)程名。
Zygote虛擬機(jī)的具體啟動(dòng)過(guò)程如下:
代碼1-1 app_process實(shí)現(xiàn)
int main(int argc, const char* const argv[])
{
//全局變量在ProcessState.cpp中定義
mArgC=argc;
mArgV=argv;
mArgLen=0;
for (int i=0; i<argc; i++) {
mArgLen+=strlen(argv[i]) + 1;
}
mArgLen--;
AppRuntime runtime;
const char *arg;
const char *argv0;
argv0=argv[0];
argc--;
argv++;
//添加VM參數(shù)
int i=runtime.addVmArguments(argc, argv);
if (i<argc) {
runtime.mParentDir=argv[i++]; //設(shè)置父路徑
}
if (i<argc) {
arg=argv[i++];
if (0==strcmp("--zygote", arg)) {
bool startSystemServer=(i<argc) ?
strcmp(argv[i], "--start-system-server")==0 : false; //系統(tǒng)服務(wù)器
setArgv0(argv0, "zygote");
set_process_name("zygote"); //設(shè)置進(jìn)程名
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer); //啟動(dòng)zygote進(jìn)程
}
else { //非zygote進(jìn)程的啟動(dòng)
set_process_name(argv0);
runtime.mClassName=arg;
runtime.mArgC=argc-i;
runtime.mArgV=argv+i;
LOGV("App process is starting with pid=%d, class=%s.\n",
getpid(), runtime.getClassName());
runtime.start();
}
}
else {
LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
fprintf(stderr, "Error: no class name or --zygote supplied.\n");
app_usage();
return 10;
}
}
當(dāng)進(jìn)程的啟動(dòng)模式為zygote模式時(shí),系統(tǒng)會(huì)調(diào)用com.android.internal.os.ZygoteInit啟動(dòng)系統(tǒng)服務(wù)器;當(dāng)進(jìn)程啟動(dòng)模式為非zygote模式時(shí),系統(tǒng)會(huì)調(diào)用com.android.internal.os.RuntimeInit啟動(dòng)進(jìn)程。關(guān)于com.android.internal.os.ZygoteInit的實(shí)現(xiàn)位于frameworks\base\core\java\com\android\internal\os\ZygoteInit.java文件中,更詳細(xì)的內(nèi)容將在2.3.4節(jié)實(shí)時(shí)進(jìn)程中討論。
無(wú)論進(jìn)程以何種模式啟動(dòng),終將會(huì)執(zhí)行Android Runtime::start(const char* className, const bool startSystem Server)函數(shù),然后經(jīng)過(guò)一系列的參數(shù)配置終啟動(dòng)一個(gè)Dalvik虛擬機(jī)。相關(guān)的代碼分布在app_main.cpp、Jni.c、init.c等文件中,啟動(dòng)Dalvik虛擬機(jī)的過(guò)程如圖1-1所示。

圖1-1 啟動(dòng)Dalvik虛擬機(jī)
在創(chuàng)建Dalvik虛擬機(jī)之前,系統(tǒng)會(huì)首先阻塞管道信號(hào),接著檢查Dalvik虛擬機(jī)的相關(guān)屬性,如dalvik.vm.checkjni、dalvik.vm.execution-mode、dalvik.vm.stack-trace-file、dalvik. vm.enableassertions、dalvik.vm.jniopts、dalvik.vm.dexopt-flags、dalvik.vm.deadlock-predict等,然后調(diào)用JNI_CreateJavaVM()函數(shù)創(chuàng)建Dalvik虛擬機(jī),后為Dalvik虛擬機(jī)進(jìn)行原生方法的注冊(cè)。