[记录]Android Zygote

zygote是Android系统创建新进程的核心模块,zygote进程在内部会先启动Dalvik虚拟机,继而加载一些必要的系统资源和系统类,最后进入一种监听状态。

在后续的运作中,当其他系统模块(比如AMS)希望创建新进程时,只需向zygote进程发出请求,zygote进程监听到该请求后,会相应地“分裂”出新的进程,于是这个新进程在初生之时,就先天具有了自己的Dalvik虚拟机以及系统资源。

Zygote进程执行过程:

  1. 创建AppRuntime对象,并调用它的start。此后的活动则由AppRuntime来控制。
  2. 调用startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
  3. 通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了Java世界。
  4. 调用registerZygoteSocket。通过这个函数,它可以响应子孙后代的请求。同时Zygote调用preloadClasses和preloadResources,为Java世界添砖加瓦。
  5. Zygote觉得自己工作压力太大,便通过调用startSystemServer分裂一个子进程system_server来为Java世界服务。
  6. Zygote完成了Java世界的初创工作,它已经很满足了。下一步该做的就是调用runSelectLoopMode后,便沉沉地睡去了。


Zygote进程调用过程:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值