💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
Zygote本身是一个Native的应用程序,和驱动、内核等均无关系。根据第3章对于init的介绍我们可以知道,Zygote是由init进程根据init.rc文件中的配置项而创建的。在分析它之前,我们有必要先简单介绍一下“zygote”这个名字的来历。zygote最初的名字叫“app_process”,这个名字是在Android.mk文件中被指定的,但app_process在运行过程中,通过Linux下的pctrl系统调用将自己的名字换成了“zygote”,所以我们通过ps命令看到的进程名是“zygote”。 zygote玩的这一套“换名把戏”并不影响我们的分析,它的原型app_process所对应的源文件是App_main.cpp,代码如下所示: **App_main.cpp** ~~~ int main(int argc, const char* const argv[]) { /* Zygote进程由init通过fork而来,我们回顾一下init.rc中设置的启动参数: -Xzygote/system/bin --zygote --start-system-server */ mArgC= argc; mArgV= argv; mArgLen = 0; for(int i=0; i<argc; i++) { mArgLen += strlen(argv[i]) + 1; } mArgLen--; AppRuntime runtime; // 调用Appruntime的addVmArguments,这个函数很简单,读者可以自行分析 int i= runtime.addVmArguments(argc, argv); if (i< argc) { //设置runtime的mParentDir为/system/bin runtime.mParentDir = argv[i++]; } if (i< argc) { arg = argv[i++]; if(0 == strcmp("--zygote", arg)) { //我们传入的参数满足if的条件,而且下面的startSystemServer的值为true bool startSystemServer = (i < argc) ? strcmp(argv[i],"--start-system-server") == 0 : false; setArgv0(argv0, "zygote"); //设置本进程名为zygote,这正是前文所讲的“换名把戏”。 set_process_name("zygote"); //①调用runtime的start,注意第二个参数startSystemServer为true runtime.start("com.android.internal.os.ZygoteInit", startSystemServer); } ...... } ...... } ~~~ Zygote的这个main函数虽很简单,但其重要功能却是由AppRuntime的start来完成的。下面,我们就来具体分析这个AppRuntime。