认识Zygote
2016-06-07 22:37
633 查看
概述
在java中不同的虚拟机实例会为不同的应用分配不同内存,为了使Android系统尽快启动,使用了Zygote来预加载核心类库和一些加载时间长的类(超过1250ms),让Dalvik虚拟机共享代码,降低占用内存和启动时间。zygote 中文为“受精卵”,由init进程通过解析init.zygote.rc文件而创建的,zygote所对应的可执行程序app_process,所对应的源文件是App_main.cpp,进程名为zygote。zygote孵化的第一个进程是System Server,而这两个都是java世界的半边天,任何一个进程死亡都会导致Java世界的奔溃。
4.2 zygote分析
zygote进程由init进程根据init.rc文件中配置创建,是android系统首个java进程,是所有java进程的父进程,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进程和应用程序进程。在孵化出第一个进程system_server后通过runSelectLoopMode等待并处理消息,分裂应用程序进程仍由system_server控制,如app启动时创建子进程小结:
宏观把握了zygote的诞生到创建java世界的的过程
参考《深入理解android卷一》
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树