zygote原理分析

Zygote本身是一个Native的应用程序。

Android系统在启动之后,首先启动init进程,init.c中解析了init.rc文件,而在android 5.1的源码中,在init.rc文件中没有发现关于zygote的section段。查找之后在import段看到了

import /init.${ro.zygote}.rc

从上边的语句可以看出init.rc不再直接引入一个固定的文件,而是根据属性ro.zygote的内容来引入不同的文件。

从android5.0开始,android开始支持64位的编译,zygote本身也就有了32位和64位的区别,所以在这里用ro.zygote属性来控制启动不同版本的zygote进程。
init.rc位于/system/core/rootdir下。在这个路径下还包括四个关于zygote的rc文件。分别是Init.zygote32.rc,Init.zygote32_64.rc,Init.zygote64.rc,Init.zygote64_32.rc。由硬件决定调用哪个文件。

下边分别以Init.zygote32.rc和Init.zygote32_64.rc为例。
在Init.zygote32.rc文件中,代码如下。

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    class main  #class是一个option,指定zygote服务的类型是main
    socket zygote stream 660 root system #socket关键字表示一个option。创建一个名为dev/socket/zygote,类型为stream,权限660的socket。
    onrestart write /sys/android_power/request_state wake #onrestart是一个option,说明在zygote重启时需要执行的command
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd

注:在init.rc中是按照section来解析每一段数据的,每一段section的起始位置是symbol标识,结束位置是下一个section开始的起始标示。在init.rc中,symbol一共有两个,分别是on和service。

在Init.zygote32.rc中,定义了一个zygote服务:zygote,由关键字service告诉init进程创建一个名为zygote的进程,这个进程要执行的程序是/system/bin/app_process,给这个进程四个参数,分别是

  • -Xzygote
  • /system/bin
  • --zygote
  • --start-system-server

在Init.zygote32_64文件中,代码如下。

service zygote /system/bin/app_process32 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd

service zygote_secondary /system/bin/app_process64 -Xzygote /system/bin --zygote --socket-name=zygote_secondary
    class main
    socket zygote_secondary stream 660 root system
    onrestart restart zygote

在Init.zygote32_64.rc文件中,定义了两个zygote服务:zygote和zygote_secondary。这两个服务最大的区别是启动的可执行文件不同,一个是app_process32,一个是app_process64。由关键字service告诉init进程创建一个名为zygote的进程,这个进程的要执行的程序是/system/bin/app_process32,给这个进程传递了有五个参数,分别是

  • -Xzygote
  • /system/bin
  • --zygote
  • --start-system-server
  • --socket-name=zygote

zygote最初的名字是app_process,他对应的源代码是App_main()。

你可能感兴趣的:(zygote原理分析)