在Android系统初始化时,init进程通过读取init.rc文件来设置环境变量,运行相应程序。而init.rc是用Android Init Language(AIL,android初始化语言)编写的。AIL可以调用parse_config_file函数来解释执行。
一、AIL包含四种类型的声明:
1/ Actions (动作)
2/ Commands (命令)
3/ Services (服务)
4/ Options (选项)
二、AIL的语法规则是:
1/ AIL以行断句,以空格断字。
2/ 以#开始的行为注释。
3/ Action 和 Service 隐含声明一个新段落,所有该段落下的Command 和 Option的声明从属于该段落。
4/ Action 与 Service 的名称是唯一的,在它们之后声明的重名类(不论类型)将视为无效。
三、Actions
Actions是一系列命令的集合,通过一个以on开头的触发器决定何时执行命令集合。当on触发器被触发(事件发生)时,该action将被添加到执行队列。当action被执行时意味着其命令集合被依次执行。
下面是触发器事件列表:
下面是命令列表:
四、Options是Services的修饰,影响着init进程何时、如何运行service。下面的Options列表
五、进程的终止与再启动
init进程读取并分析init.rc文件,获取Services(服务列表),而后将依据服务列表依次启动服务子进程。
init进程启动的主要进程如下:
sh
adbd:android调试桥
servicemanager:重要,负责管理系统服务
vold:Volume Dameon,用于挂载/管理USB存储或SD卡设备
palymp3:输出启动音
在init启动的诸多进程中,除了一小部分外,大部分进程出现意外终止时,init进程都要重启它们。
特别注意:
1、源码/system/core/rootdir/下的一系列.rc文件最终会编译到ramdisk.img中,随kernel一起打包成boot.img。所以对这些启动文件的修改必须通过刷boot.img才可以生效。
2、rc文件中的service都是以独立进程运行的,属于Android native service,通过ps命令可以查到。他们的ppid都是1,即由init进程启动。