zygote是Android系统创建新进程的核心模块,zygote进程在内部会先启动Dalvik虚拟机,继而加载一些必要的系统资源和系统类,最后进入一种监听状态。
在后续的运作中,当其他系统模块(比如AMS)希望创建新进程时,只需向zygote进程发出请求,zygote进程监听到该请求后,会相应地“分裂”出新的进程,于是这个新进程在初生之时,就先天具有了自己的Dalvik虚拟机以及系统资源。
Zygote进程执行过程:
- 创建AppRuntime对象,并调用它的start。此后的活动则由AppRuntime来控制。
- 调用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后,便沉沉地睡去了。
1. app_main:main()-> AppRuntime:start("com.android.internal.os.ZygoteInit", "start-system-server")-> AppRuntime:startVm() -> AppRuntime:startReg()-> CallStaticVoidMethod("ZygoteInit", "main")
2. ZygoteInit:main() -> ZygoteInit:registerZygoteSocket()-> ZygoteInit:preloadClasses -> ZygoteInit:preloadResources -> ZygoteInit:startSystemServer()-> Zygote:forkSystemServer()
3. ZygoteInit:handleSystemServerProcess()->RuntimeInit:zygoteInit()-> AndroidRuntime:nativeZygoteInit() -> app_main:onZygoteInit() -> ProcessState:self():startThreadPool()
4. RuntimeInit:applicationInit() -> invokeStaticMain("SystemServer", "main")
Zygote在startSystemServer()之后,会进一步走到ZygoteInit:runSelectLoop()监听socket,当收到AMS调用Process.start("android.app.ActivityThread",...)时会启动一个新的进程。
所有的binder相关初始化都完成在app_main:onZygoteInit(),因此通过Zygote生出来的进程本身都具有binder相关功能能。
通过init.rc中对zygote服务的描述可知,其对应的程序为:/system/bin/app_process
1service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
2 class main
3 socket zygote stream 660 root system
4 onrestart write /sys/android_power/request_state wake
5 onrestart write /sys/power/state on
6 onrestart restart audioserver
7 onrestart restart cameraserver
8 onrestart restart media
9 onrestart restart netd
10 writepid /dev/cpuset/foreground/tasks
该服务会在on boot时触发,其程序为/system/bin/app_process,服务名为zygote,-Xzygote /system/bin --zygote --start-system-server为参数列表。
在创建了zygote 服务后,在目录下建立一个stream socket文件/dev/socket/zygote,权限为666,当zygote服务重启时,重启media等服务。
[附二]
[附三]
SystemServer:main()
[参考资料]
Android4.4的zygote进程
https://my.oschina.net/youranhongcha/blog/469447
[深入理解Android卷一全文-第四章]深入理解zygote
http://blog.csdn.net/innost/article/details/47207845