欢迎光临散文网 会员登陆 & 注册

【Android FrameWork】Zygote

2023-04-05 05:02 作者:Lianun  | 我要投稿

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方法



【Android FrameWork】Zygote的评论 (共 条)

分享到微博请遵守国家法律