【Android FrameWork】Zygote

58:05 up画流程图
下面是我自己总结的大致的流程,可能会有错,所以只能供参考。
init.rc 找到zygote的解析文件 执行app_main的main函数
-创建AppRuntime对象,
-解析参数,
-然后调用runtime对象的start函数(传入“com....ZygoteInit”等参数)
--通过jni_invocation.Init(Null)加载libart.so函数库
--通过startVm(&mJavaVM,&env,zygote)创建Java虚拟机
--通过startReg(env)注册JNI环境(封装了许多jni函数) 17:34
--解析参数找到ZygoteInit.java的main函数,并通过CallStaticVoidMethod(startClass,startMeth,strArry) 调用java层的ZygoteInit的main函数
---创建ZygoteServer服务端(没有实例化),
---通过startZygoteNoThreadCreation开启线程的限制
---设置参数后,通过preload(bootTimingsTraceLog)进行预加载,预加载clss,系统资源,drawable,color等
---加载完后,通过gcAndFinalize()进行一次gc
---通过initNativeState(isPrimaryZygote)对Zygote初始化一些native state
---通过stopZygoteNoThreadCreation()关闭线程创建限制
---实例化ZygoteServer,然后通过forkSystemServer(...)开启SystemServer
---通过zygoteServer.runSelectLoop(abiList) 开启循环,等待客户端请求并处理(注意这里会等待一个caller返回){//下面是死循环
----通过Os.poll(...)进行阻塞,等待请求
----如果拿到请求,就会调用processsOneCommand(this)处理客户端的请求(这里会返回caller)
-----将参数包装进ZygoteArguments包装类里
-----通过Zygote.forkAndSpecialize(...)将子进程fork出来,具体是函数内部会调用native的nativeForkAndSpecialize函数->ForkCommon(...)->fork()
-----然后处理子进程的事情,如通过closeServerSocket关闭ServerSocket
-----最后调用handleChildProc进行处理(这里会返回caller)
------通过closeSocket()关闭socket请求
------通过ZygoteInit.zygoteInit(...)来初始化进程信息,并且创建binder
-------通过ZygoteInit.nativeZygoteInit()来初始化进程信息,并且创建binder, 其中nativeZygoteInit里面会调用appRuntime的onZygoteInit方法,这个方法会①调用ProcessState::self方法来创建初始化进程信息 ②开启线程池
-------初始化完成后会调用RuntimeInit.applicationInit(...)方法对客户端请求信息进行包装,然后返回一个caller,这个caller包装了客户端请求调用的类的main方法的信息}
---拿到caller后,会退出循环,通过caller.run方法调用客户端请求调用的类的main方法