Android init.rc 文件分析
rc 脚本由4种类型声明组成,Action、Commands、Services、Options
Action(动作)
通过触发器 trigger,即以 on 开头的语句来决定执行相应的 service 的 时机,具体有如下时机:
- on early-init : 在初始化早期阶段触发;
- on init: 在初始化阶段触发;
- on late-init: 在初始化晚期阶段触发;
- on boot/charger: 当系统启动/充电时触发,还包含其他情况,此处不一一列举;
- on property: key=value: 当属性值满足条件时触发;
Services(服务)
服务 Service,以 service 开头,由 init 进程启动,一般运行在 init 的一个子进程, 所以启动 service 前需要判断对应的可执行文件是否存在。
init 生成的子进程, 定义在 rc 文件,其中每一个 service 在启动时会通过 fork 方式生成子进程。
例如,代表的是服务名为 servicemanager,服务执行的路径为/system/bin/servicemanager。
Commands(命令)
常用的命令
- class_start <service_class_name>: 启动属于同一个 class 的所有服务;
- start <service_name>: 启动指定的服务,若已启动则跳过;
- stop <service_name>: 停止正在运行的服务
- setprop :设置属性值
- mkdir
:创建指定目录 - symlink <sym_link>: 创建连接到的<sym_link>符号链接;
- write
: 向文件 path 中写入字符串; - exec: fork 并执行,会阻塞 init 进程直到程序完毕;
- exprot :