zygote浅析

《深入解析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函数。流程图:

zygote浅析_第1张图片
SystemServer.jpg

Zygote其实就是Native进入Java世界的入口。

你可能感兴趣的:(zygote浅析)