Android启动流程---init

一、概述

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

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

1. main方法

添加代码,解析init.rc

2. console_init_action

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

这里写图片描述

二、信号处理

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

主要工作:

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

1. signal_handler_init

这里写图片描述

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

SIGCHLD_handler和handle_signal,如下:
这里写图片描述

三、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)

这里写图片描述

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

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

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值