概述
在Android系統中,所有的應用程序進程,以及用來運行系統關鍵服務的System進程都是由zygote進程負責創建的。因此,我們將它稱為進程孵化器。zygote進程是通過復制自身的方式來創建System進程和應用程序進程的。由于zygote進程在啟動時會在內部創建一個虛擬機實例,因此,通過復制zygote進程而得到的System進程和應用程序進程可以快速地在內部獲得一個虛擬機實例拷貝。
zygote進程在啟動完成之后,會馬上將System進程啟動起來,以便它可以將系統的關鍵服務啟動起來。下面我們將介紹zygote進程的啟動腳本,然后分析它和System進程的啟動過程。
zygote分析
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
在我之前的一篇博客中已經分析了init進程是如何啟動service服務了,需要了解的同學可以參考這篇文章:Android init進程――解析配置文件
通過zygote服務的啟動腳本,我們可以知道,zygote進程的實際是二進制文件app_process的調用,我們就從這個應用程序的main函數入手去分析一下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./n"); app_usage(); LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied"); return 10; }}
在zygote的main函數中,通過AppRuntime runtime代碼創建了一個AppRuntime對象runtime,接下來Zygote進程就是通過它來進一步啟動的。
init.rc中關于啟動zygote命令中包含了
主站蜘蛛池模板:
国产一区二区不卡视频
|
国产福利电影在线观看
|
一级看片
|
日韩av电影观看
|
成人福利影院
|
全免费一级毛片免费看
|
香蕉av777xxx色综合一区
|
国产精品久久久久aaaa九色
|
精品一区av
|
亚洲国产精品一区
|
午夜精品一区二区三区免费视频
|
波多野结衣一二三四区
|
黄色在线资源
|
性视频网站免费
|
中文字幕一区二区三
|
日韩av免费
|
成人免费xxxxxxx
|
久久久免费精品视频
|
免费毛片视频
|
国产第10页|
国产精品久久久一区二区三区
|
h片在线看
|
久久久久久免费毛片精品
|
久久精品国产免费看久久精品
|
91蜜桃婷婷亚洲最大一区
|
嗯嗯嗯亚洲精品国产精品一区
|
欧美区国产区
|
不卡av电影在线观看
|
久久综合狠狠综合久久综合88
|
xx视频在线观看
|
久久久久无码国产精品一区
|
色综合88
|
久久99深爱久久99精品
|
男女羞羞视频在线观看
|
亚洲精品久久久久
|
www.99re|
久久成人国产精品
|
国产视频网|
欧美一区二区三区免费
|
久久久久久久免费
|
久久久久女人精品毛片九一韩国
|