一、init.rc是什么?
adnroid系统就像是是运行在linux系统上的一个“服务进程”,并不算是一个完整的操作系统。这些服务进程是维持设备正常运转的关键,而这些进程的鼻祖就是init进程。而init进程就是通过解析init.rc脚本来启动的,所以说init.rc实际上就是一个脚本文件。
二、init.rc的语法
官方文档路径: system/core/init/Readme.txt
一个完整的init.rc脚本由4种类型的声明组成:
Action(动作)
Commands(命令)
Services(服务)
Options(选项)
接下来是一些通用的语法规则:
注释以 # 开头
关键字和参数以空格分隔,每个语句以行为单位
C语言风格的 \ 转义字符可以用来为参数添加风格
字符串使用 “ ”
行尾的 \ 用来表示和下面一行是同一行
Actions(动作)和Services(服务)就是一个新语句的开始,这个两个后面跟着Commands(命令)或Options(选项)都属于这个新语句
Actions(动作)和Services(服务)有唯一的名字,如果出现重名就会被当成错误忽略掉
三、Actions(动作)
从下面的截图中可以看到,一个动作其实就是响应某个事件的过程。
将下图翻译一下: 当early-init这个触发条件产生时,依次执行下面的命令1、命令2、命令3、命令4
**源码实现思想:**当相应的事件发生后,系统就会对init.rc中的各个触发条件进行匹配,只要匹配成功就会把这个动作加到“命令执行队列的尾部”,等待执行。如果已经存在是不会再次添加的。

四、Commands(命令)
上面已经说过了,命令会在条件触发后一条一条的执行。
init.rc中常见的触发条件
触发条件 | 解释 | 示例 |
boot | 这是init程序启动后触发的第一个事件 | on boot |
<name> = <Value> | 当属性name满足特定的value时触发 | on property:vold.decrypt=trigger_load_persist_props |
device-added-<path> device-removed-<path> | 当设备节点添加/删除时会触发 | |
service-exited-<name> | 当指定的服务<name>存在时触发 |
init.rc中常见的命令
命令 | 描述 | 示例 |
exec <path> <arguments> | fork并执行一个程序,程序的路径为<path>。这条命令会阻塞直到该程序启动完成 | # Lock the fs-verity keyring, so no more keys can be added exec -- /system/bin/fsverity_init --lock |
export <name> <value> | 剩下的后面再写吧 |
五、Services(服务)
Services其实是可执行程序,他们在特定选项的约束下会被init程序运行或者重启。
一般格式:
Service <name> <pathname> <argument>
<option>
<option>
......
<name>表示service的名称
<pathname>表示service所在的路径
<argument>表示启动service所带的参数
<option>表示对这个service的约束选项
示例:

六、options(选项)
看了上面的内容,相信大家已经对选项不再陌生了。
综合以上的分析就能发现,其实init.rc的语法可以概括为以下形式:
on <sometime-happened>
<wait-to-do>
当某些条件触发的时候就去做某些事,怎么样是不是很简单呢!