目录
分析步骤
1.init进程的启动
在init进程启动前,系统还会进行几个重要的步骤,如下所示:
2.init进程的入口函数
这里我们查看system/core/init/init.cpp的main函数,可以看到其中有行代码是解析init.rc文件
3.解析init.rc
init.rc 是一个非常重要的配置文件,它是由 Android 初始化语言编写的脚本,不过在Android 8.0 中对 init.rc 文件进行了拆分,每个服务对应一个 rc 文件。我们要分析的 Zygote 启动脚本则在 init.zygoteXX.rc 中定义,这里拿 64 位处理器为例,init.zygote64.rc 的代码如下所示:
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
class main
priority -20
user root
group root readproc
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
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
大概可以分析是Service 用于通知 init进程创建名为 zygote 的进程,这个进程执行程序的路径为/system/bin/app_process64,其后面的代码是要传给 app_process64 的参数。class main 指的是 Zygote 的 classname 为main。
5.init启动Zygote
然后我们可以搜索app_process,可以找到app_main.cpp
打开app_main.cpp我们可以发现这里有一个main函数可以接收参数,而接收的参数也正是init.zygote64.rc第一行配置的
我们再往下看代码发现这里会匹配参数,当参数为–zygote的时候zygote变量设置为true
然后我们在往下找发现在最底下,当zygote为true时会启动ZygoteInit(这里的类是Java类)
然后我们搜索ZygoteInit,可以找到一个Java文件
并且我们可以在ZygoteInit.java文件中找到main函数入口
然后我们再回到app_main.cpp,我们进入start函数中查看
我们发现在这里会调用main方法(也就是调用ZygoteInit.java的main方法)这时候Zygote就启动了
链接:https://www.jianshu.com/p/c0e018f0d37a