Android Framework分析init进程如何启动 Zygote 进程

目录

分析步骤

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值