当Zygote进程启动后, 便会执行到frameworks/base/cmds/app_process/App_main.cpp文件的main()方法. 整个调用流程:
int main(int argc, char* const argv[]) { AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv)); while (i < argc) { ...//参数解析 } //设置进程名 if (!niceName.isEmpty()) { runtime.setArgv0(niceName.string()); set_process_name(niceName.string()); } if (zygote) { // 启动AppRuntime runtime.start("com.android.internal.os.ZygoteInit", args, zygote); } else if (className) { runtime.start("com.android.internal.os.RuntimeInit", args, zygote); } }
Zygote进程都是通过fock自身创建子进程的,在app_process进程启动过程,有两个分支:
- 当zygote为true时,则执行ZygoteInit.main()
- 当zygote为false时,则执行RuntimeInit.main()
AndroidRuntime::start
void AndroidRuntime::start(const char* className, const Vector<String8>& options) { ... // 虚拟机创建 if (startVm(&mJavaVM, &env, zygote) != 0) { return; } onVmCreated(env); // JNI方法注册 if (startReg(env) < 0) { return; } ... // 调用ZygoteInit.main()方法 env->CallStaticVoidMethod(startClass, startMeth, strArray);
ZygoteInit:main
public static void main(String argv[]) { try { ... registerZygoteSocket(socketName); //为Zygote注册socket preload(); // 预加载类和资源 ... if (startSystemServer) { startSystemServer(abiList, socketName);//启动system_server } Log.i(TAG, "Accepting command socket connections"); runSelectLoop(abiList); //进入循环模式 ... } catch (MethodAndArgsCaller caller) { caller.run(); //启动system_server } ... }
由此可知,ZygoteInit.java的main方法一共做了4件事:
1.创建一个server端的socket。
2.预加载类和资源。
3.启动SystemServer 进程。
4.等待AMS请求创建新的应用程序进程。