Zygote解析

800 阅读2分钟

Zygote的作用

  1. 启动SystemServer(常用类,JNI函数,主题资源,共享课继承自Zygote,不用重复加载)
  2. 孵化应用进程(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 启动之后

  1. 调用startVm()创建Java虚拟机,
  2. 然后调用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()后,便沉沉的睡去。

参考

  • Android系统源代码情景分析
  • 深入解析Android 卷I
  • 慕课网