Android Framework分析init进程如何启动 Zygote 进程_android init进程创建zygote进程的流程

53 阅读3分钟

在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函数中查看

最后

代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。

所以,长征路还长,大家还是好好地做个务实的程序员吧。

最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~

我的 Android 学习,面试文档,视频收集大整理