Zygote的作用
- 启动SystemServer(常用类,JNI函数,主题资源,共享课继承自Zygote,不用重复加载)
- 孵化应用进程(Zygote进程起到了预加载资源和类到虚拟机 加快启动应用程序的作用)
Zygote的启动流程
init.rc 定义了一些要启动的服务, zygote是其一
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks
- init进程通过fork和execve启动Zygote进程
- 可执行程序名称 : zygote
- 可执行程序路径 : /system/bin/app_process64
- 可执行程序参数 : -Xzygote /system/bin --zygote --start-system-server(最后一个参数“--start-system-server”表示Zygote进程在启动完成之后,需要马上将System进程也启动起来。)
- socket zygote stream 660 root system 表示Zygote进程在启动的过程中,需要在内部创建一个名称为“zygote”的Socket。这个Socket是用来执行进程间通信的,它的访问权限被设置为666,即所有用户都可以对它进行读和写。运行在System进程中的Activity管理服务ActivityManagerService就是通过这个Socket来请求Zygote进程创建新的应用程序进程的。
Zygote 启动之后
- 调用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()后,便沉沉的睡去。
参考
- Android系统源代码情景分析
- 深入解析Android 卷I
- 慕课网