一.init.rc的基本组成单位
init.rc文件是以section为单位组织的。它的格式如下:
section关键字 xxx
xxx
xxx
xxx
由上可看出section可以包含多行,section的关键字有三个on、service、import。
二.init.rc的三个关键字
1.on
on <trigger> [&& <trigger>]*
<command>
<command>
<command>
trigger分为事件触发器和属性触发器。
- 事件触发器:由init的QueueEventTrigger函数匹配字符串触发,比如"early-init"、“late-init”
- 属性触发器:当修改属性时触发,这里分两种
# 第一种,在"属性"设置为指定的值"value"时触发 on property:<name>=<value> # 第二种,修改了"属性"就会触发 on property:<name>=*
command命令:本来想列出来,但是是在太多了。授人以鱼不如授人以渔(其实是懒),直接到/system/core/init/readme.txt下查看吧
2.services
service <name> <pathname> [ <argument> ]*
<option>
<option>
option影响init运行服务的方式和时间
option | 说明 |
---|---|
critical | 这是一个设备关键服务。如果在4分钟内退出超过4次,设备将重新启动进入恢复模式。 |
disabled | 这个服务不会自动启动它的类。它必须明确地按名称启动。 |
setenv <name> <value> | 在启动的进程中设置环境变量 |
socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ] | 创建一个名为/dev/socket/<name>的unix域套接字并传递它的fd指向启动的进程。 <type>必须是"dgram", “stream"或"seqpacket”。 <user>和<group> 默认为0。 'seclabel’是套接字的SELinux安全上下文。它默认为服务安全上下文,由seclabel指定或基于服务可执行文件的安全上下文 |
user <username> | 表示将用户切换为<username> |
group <groupname> [ <groupname> ]* | 表示将组切换为<groupname> |
seclabel <seclabel> | selinux用的,转换服务的安全上下文。如果没指定,就默认为init的上下文 |
oneshot | 当服务退出时,不要重新启动服务。 |
class <name> | 指定一个要启动的类,这个类中如果有多个service,将会被同时启动。默认的class将会是“default” |
onrestart | 在重启时执行一条命令 |
3.import
相当包含另外一些section。格式:
import <rc path>