在Android系統中,所有的利用程序進程,和用來運行系統關鍵服務的System進程都是由zygote進程負責創建的。因此,我們將它稱為進程孵化器。zygote進程是通過復制本身的方式來創建System進程和利用程序進程的。由于zygote進程在啟動時會在內部創建1個虛擬機實例,因此,通過復制zygote進程而得到的System進程和利用程序進程可以快速地在內部取得1個虛擬機實例拷貝。
zygote進程在啟動完成以后,會馬上將System進程啟動起來,以便它可以將系統的關鍵服務啟動起來。下面我們將介紹zygote進程的啟動腳本,然后分析它和System進程的啟動進程。
zygote進程的啟動腳本以下:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
在我之前的1篇博客中已分析了init進程是如何啟動service服務了,需要了解的同學可以參考這篇文章:Android init進程――解析配置文件
通過zygote服務的啟動腳本,我們可以知道,zygote進程的實際是2進制文件app_process的調用,我們就從這個利用程序的main函數入手去分析1下zygote進程的啟動進程,源碼以下(/frameworks/base/cmds/app_process/app_main.cpp):
/**
* 將-Xzygote加入到JavaVMOption中,返回/system/bin參數指向的下標
*/
int AndroidRuntime::addVmArguments(int argc, const char* const argv[])
{
int i;
for (i = 0; i < argc; i ++) {
if (argv[i][0] != '-') {
return i;
}
if (argv[i][1] == '-' && argv[i][2] == 0) {
return i + 1;
}
JavaVMOption opt;
memset(&opt, 0, sizeof(opt));
opt.optionString = (char*)argv[i];
mOptions.add(opt);
}
return i;
}
int main(int argc, char* const argv[])
{
// zygote call parameters
// /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
// These are global variables in 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* argv0 = argv[0];
// Process command line arguments
// ignore argv[0]
argc --;
argv ++;
// Everything up tp '--' or first non '-' arg goes to the vm
int i = runtime.addVmArguments(argc, argv);
// Parse runtime arguments. Stop at first unrecognized option.
bool zygote = false;
bool startSystemServer = false;
bool application = false;
const char* parentDir = NULL;
const char* niceName = NULL;
const char* className = NULL;
while (i < argc) {
const char* arg = argv[i ++];
if (!parentDir) {
parentDir = arg;
} else if (strcmp(arg, "--zygote") == 0) {
zygote = true;
niceName = "zygote";
} else if (strcmp(arg, "--start-system-server") == 0) {
startSystemServer = true;
} else if (strcmp(arg, "--application") == 0) {
application = true;
} else if (strncmp(arg, "--nice-name=", 12)) {
niceName = arg + 12;
} else {
className = arg;
break;
}
}
if (niceName && *niceName) {
setArgv0(argv0, niceName);
set_process_name(niceName);
}
runtime.mParentDir = parentDir;
if (zygote) {
// 進入到AppRuntime的start函數
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer? "start-system-server" : "");
} else if (className) {
runtime.mClassName = className;
runtime.mArgc = argc - i;
runtime.mArgv = argv + i;
runtime.start("com.android.internal.os.RuntimeInit", application ? "application" : "tool");
} else {
fprintf("stderr", "Error: no class name or --zygote supplied.
");
app_usage();
LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied");
return 10;
}
}
在zygote的main函數中,通過AppRuntime runtime代碼創建了1個AppRuntime對象runtime,接下來Zygote進程就是通過它來進1步啟動的。
init.rc中關于啟動zygote命令中包括了
上一篇 iOS:數據轉json對象
下一篇 第八周項目-1.1