《深入解析Android 卷I》对zygote解释的非常有意思,他是这样说的
zygote
是Android系统中创建Java世界的盘古,他创建了第一个Java虚拟机,同时他又是女娲,它成功地移植了framwork的核心System_server
进程。
- 第一天:创建AppRunntime对象,并调用他的
start()
方法,此后的活动有AppRunntime控制。 - 第二天:调用
startVm()
创建Java虚拟机,然后调用startReg()
来注册JNI函数。 - 第三天: 通过JNI调用
com.android.internal.os.ZygoteInit
类的main函数,从此进入Java世界。然而这个事件刚开始开创的时候什么都没有。 - 第四天:调用
registerZygoteSocket()
,通过这函数他可以响应子孙后代的请求同时zygote调用了preloadClasses()
和preloadResources()
开始为Java世界添加类和资源 - 第五天:zygote 觉得自己的工作压力太大了,遍通过调用
startSystemServer()
分裂一个子进程system_server
来为Java世界服务。 - 第六天:zygote完成了Java世界的初创工作,他已经很满足了。下一步该做的就是
runSelectLoopMode()
后,便沉沉的睡去。 - 未来很多天:当接受子孙后代的请求的时候,他就会醒来,帮他们打Boss,然后再睡去。
(感觉好像玄幻小说有没有,编程正式趣味无穷啊!)
少主SystemServer的功法
出生
//这个方法定义在dalvik_system_Zygote.c中
pid = Zygote.forkSystemServer(parsedArgs.uid, parsedArgs.gid, parsedArgs.gid, debugFlags null );
使命
handleSystemServerProcess(parsedArgs);
这个方法主要在RuntimeInit.java
实现有两方面
public static final void zygoteInit(String[] argv) throws ZygoteInit.MethodAndArgsCaller{
zygoteInitNative(); //与Binder通信系统建立联系,加入进程队列中
......
invokeStaticmain(); //抛出异常导致com.android.server.SystemServer类的main函数调用,通过这种方法可以减少浪费之前函数调用多占用的一些调用堆栈。
}
SystemServer的总结
ZygoteInit 分裂产生的SystemServer其实就是调用com.android.server.SystemServer的main函数。流程图:
SystemServer.jpg