init进程启动过程

Android系统中,应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器。它通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程。

Zygote进程是在init进程启动时创建的,起初Zygote进程的名称并不是叫“zygote”,而是叫“app_process”,这个名称是在Android.mk中定义的,Zygote进程启动后,Linux系统下的pctrl系统会调用app_process,将其名称换成了“zygote”。

Zygote启动脚本分析

init.rc文件中采用了import引入Zygote启动脚本。

//system/core/rootdir/init.rc
import /init.${ro.hardware}.rc
import /init.usb.configfs.rc
import /init.${ro.zygote}.rc//导入zygote.rc

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

Android 5.0开始,Android开始支持64位程序,Zygote也就有了32位和64位的区别,所以在这里用ro.zygote属性来控制使用不同的Zygote启动脚本,从而也就启动了不同版本的Zygote进程,ro.zygote属性的取值有以下4种:

  • init.zygote32.rc

  • init.zygote32_64.rc

  • init.zygote64.rc

  • init.zygote64_32.rc

//system/core/rootdir/init.zygote64.rc
//启动zygote service 路径/system/bin/app_process64
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

app_main

main

app_main.cppmain方法会接收传进的来参数,并根据传进来的参数调用AndroidRuntimestart方法。

AndroidRuntime

start

AndroidRuntimestart方法负责启动虚拟机,并根据传进来的类名,获取到对应的类,并执行该类的main方法。在app_main.cppmain方法中,我们传进来的是ZygoteInit类, 所以执行的就是ZygoteInitmain方法。

ZygoteInit

main

ZygoteInitmain方法中,主要做了四件事情:

  • 注册一个Socket

  • 预加载各种资源

  • 启动SystemServer

  • 进入循环,等待AMS请求创建新的进程

registerZygoteSocket

registerZygoteSocket方法主要负责注册一个Socket

startSystemServer

runSelectLoop

acceptCommandPeer

ZygoteConnection

构造函数

runOnce

zygote需要为每个新启动的应用程序声称该自己独立的进程。不过runOnce并没有直接使用fork来完成这一工作,而是调用了forkAndSpecialize。另外,新创建的进程中一定需要运行工应用程序本身的代码,这一部分工作是在handleChildProc中展开的。

执行完上述的任务后,父进程还需要做一些清尾工作才算“大功告成”。包括:将子进程加入进程组;正确关闭文件;调用方返回结果值等。

readArgumentList

Zygote

forkAndSpecialize

forkAndSpecialize的处理分为3个阶段,即preFork、nativeForkAndSpecialize以及postForkCommon。

最后更新于