Android系统启动流程(一)解析init进程启动过程
主要源码目录:
<span style="color:#172b4d"><span style="background-color:#2d2d2d"><span style="color:#cccccc"><code class="language-kotlin"><span style="color:#67cdcc">/</span>system<span style="color:#67cdcc">/</span>core<span style="color:#67cdcc">/</span><span style="color:#cc99cd">init</span><span style="color:#67cdcc">/</span></code></span></span></span>
http://androidxref.com/6.0.0_r1/xref/system/core/init/init.cpp1.init简介
init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init。
init进程启动
init的入口函数为main,代码如下所示。
system/core/init/init.cpp
init进程总结
讲到这,总结起来init进程主要做了三件事:
1.创建一些文件夹并挂载设备
2.初始化和启动属性服务
3.解析init.rc配置文件并启动zygote进程
-------------------------------------------------------
子进程可以继承父进程的资源
1).init.rc和init.cpp是干嘛的
main 方法里面,因为它是c语言,有 148 行代码(不包括子函数代码)具体分为四个步骤:
1.创建目录,挂载分区(android Q分区有所改变)
2.解析启动脚本. init.rc 文件是 Android 系统的重要配置文件,位于 /system/core/rootdir/init.rc
3.启动解析的服务
4.守护解析的服务。
问题:init 进程是如何守护子进程的?
socketpair,信号sigle
初始化epoll,依次设置signal、property、keychord这3个fd可读时相对应的回调函数。进入无线循环,用来响应各个进程的变化与重建。
问题:init创建了哪些服务?
init 创建了 zygote(创建 App 应用的服务)、
servicemanager (client 与 service 通信管理的服务)
surfaceflinger(显示渲染服务)
media(多媒体服务) 等 service 进程。
问题:init如何启动zygote进程的?
frameworks/base/cmds/app_process/app_main.cpp
int main(int argc, char* const argv[]) { ... if (zygote) { runtime.start("com.android.internal.os.ZygoteInit", args, zygote);//1 } else if (className) { runtime.start("com.android.internal.os.RuntimeInit", args, zygote); } else { fprintf(stderr, "Error: no class name or --zygote supplied.\n"); app_usage(); LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied."); return 10; } }
问题:里面的死循环是干嘛的?
init.c 无限循环遍历service_list进行守护