认识 zygote

1,668 阅读2分钟

版权声明:如有转载请注明出处 http://blog.csdn.net/xsf50717,谢谢~

概述

zygote “受精卵”,由init进程通过解析init.zygote.rc文件而创建的,zygote所对应的可执行程序app_process,所对应的源文件是App_main.cpp,进程名为zygote。zygote孵化的第一个进程是System Server,而这两个都是java世界的半边天,任何一个进程死亡都会导致Java世界的奔溃。

4.2 zygote分析

zygote由init进程根据init.rc文件中的配置创建,zygote最初名字叫“app_process”,这个名字是在Android.mk文件中指定的,但是在运行过程中Linux下的pctrl系统调用将自己名字换成了“zygote”,因此通过ps命令查看到进程名称为”zygote”.原型app_process所对应的源文件是App_main.cpp

涉及到的函数调用

`App_main.main
AndroidRuntime.start
    startVm
    startReg
    ZygoteInit.main
        registerZygoteSocket
        preload
        startSystemServer
        runSelectLoop`

从AndroidRuntime到ZygoteInit

主要分为2大过程

1、创建虚拟机——startVm:调用JNI虚拟机创建函数

2、注册JNI函数——startReg:前面已经创建虚拟机,这里就需要给这个虚拟机注册一些JNI函数(后续java世界用到的函数是native实现,这里需要提前注册注册这些函数)

此时就要执行CallStaticViodMethod,通过这个函数将进入android精心打造的java世界,这个函数将调用com.android.internal.os.ZygoteInit的main函数

进入java世界

在 ZygoteInit.main函数中进入java世界,但是这个世界啥都没与需要做很多初始化工作,主要有4个关键步骤

1、建立IPC通信服务——registerZygoteSocket

zygote及系统中其他程序的通信并没有使用Binder,而是采用基于AF_UNIX类型的Socket,registerZygoteSocket函数的作用正是建立这个Socket

预加载类和资源

主要是preloadClasses和preloadResources,其中preloadClasses一般是加载时间超过1250ms的类,因而需要在zygote预加载

启动system_server——startSystemServer

这个函数会创建Java世界中系统Service所驻留的进程system_server,该进程是framework的核心,也是zygote孵化出的第一个进程。如果它死了,就会导致zygote自杀。

等待请求——runSelectLoppMode

zygote从startSystemServer返回后,将进入第四个关键函数runSelectLoppMode,在第一个函数registerZygoteSocket中注册了一个用于IPC的Socket将在这里使用,这里Zygote采用高效的I/O多路复用机制,保证在没有客户端请求时或者数据处理时休眠,否则响应客户端的请求

此时zygote完成了java世界的初创工作,调用runSelectLoppMode便开始休眠了,当收到请求或者数据处理便会随时醒来,继续工作

zygote的分裂

zygote孵化出第一个进程system_server,通过runSelectLoopMode等待并处理消息,分裂仍由system_server控制,如app启动时创建子进程

小结:

宏观把握了zygote的诞生到创建java世界的的过程

参考《深入理解android卷一》

我的同类文章

Android相关(58)