版权声明:如有转载请注明出处 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)