Android启动流程---init

一、概述

init是Linux系统中用户空间的第一个进程,进程号为1。Kernel启动后,在用户空间,启动init进程,并调用init中的main()方法执行init进程的职责。对于init进程的功能分为4部分:

分析和运行所有的init.rc文件;
生成设备驱动节点; (通过rc文件创建)
处理子进程的终止(signal方式);
提供属性服务。

1. main方法

Android启动流程---init_第1张图片

2. console_init_action

开机显示的底部带ANDROID字样的画面

Android启动流程---init_第2张图片

二、信号处理

在init.cpp的main()方法中,通过signal_handler_init()来初始化信号处理过程。

主要工作:

初始化signal句柄;
循环处理子进程;
注册epoll句柄;
处理子进程的终止;

1. signal_handler_init

Android启动流程---init_第3张图片

每个进程在处理其他进程发送的signal信号时都需要先注册,当进程的运行状态改变或终止时会产生某种signal信号,init进程是所有用户空间进程的父进程,当其子进程终止时产生SIGCHLD信号,init进程调用信号安装函数sigaction(),传递参数给sigaction结构体,便完成信号处理的过程。

SIGCHLD_handler和handle_signal,如下:
Android启动流程---init_第4张图片

三、rc文件语法

rc文件语法是以行尾单位,以空格间隔的语法,以#开始代表注释行。rc文件主要包含Action、Service、Command、Options,其中对于Action和Service的名称都是唯一的,对于重复的命名视为无效。

1. Action

Action: 通过trigger,即以 on开头的语句,决定何时执行相应的service。

2. Service

服务Service,以 service开头,由init进程启动,一般运行于另外一个init的子进程,所以启动service前需要判断对应的可执行文件是否存在。init生成的子进程,定义在rc文件,其中每一个service,在启动时会通过fork方式生成子进程。

3.Command

class_start : 启动属于同一个class的所有服务;
start : 启动指定的服务,若已启动则跳过;
stop : 停止正在运行的服务
setprop :设置属性值
mkdir :创建指定目录
symlink : 创建连接到的符号链接;
write : 向文件path中写入字符串;
exec: fork并执行,会阻塞init进程直到程序完毕;
exprot :设定环境变量;
loglevel :设置log级别

四、启动服务

1. 服务启动(Zygote)

Android启动流程---init_第5张图片

通过init_parser.cpp完成整个service解析工作,此处就不详细展开讲解析过程,该过程主要是创建一个名”zygote”的service结构体,一个socketinfo结构体(用于socket通信),以及一个包含6个onrestart的action和1个writepid的结构体。

Zygote服务会随着main class的启动而启动,退出后会由init重启zygote

Android启动流程---init_第6张图片

你可能感兴趣的:(Android)