1.简述:
Android init.rc文件由用户空间的第一个进程init解析,主要包含五种语句: Actions,Commands,Services,Options,Imports; 在init.rc文件中一条语句通常是占据一行.单词之间是通过空格符来相隔的.如果需要在单词内使用空格,那么得使用转义字符"",如果在一行的末尾有一个反斜杠,那么是换行折叠符号,应该和下一行合并成一起来处理,这样做主要是为了避免一行的字符太长,与C语言中的含义是一致的。注释是以#号开头。
2. 关键字:
Sections:语句块;以service开头的叫服务,以on开头的叫动作。
Actions: 动作
Services: 服务
Commands:命令
Options:选项
Imports:导入
Trigger:触发器或触发条件
class:类属,即可以为多个service指定一个相同的类属,方便操作同时启动或停止.
3. 语句解析
3.1 Actions
动作由一系列commands组成,动作包含一个trigger,决定了action何时执行,当trigger满足条件时,这个动作将被加到待执行动作队列的尾部,(除非它已经在
队列)
语法:
on <trigger> [&& <trigger>]*
<command>
<command>
...
eg:
on boot
setprop a 0
setprop b 0
on boot && property:ro.crypto.state=unsupported
start <service>
3.2 Services
服务是指那些需要在系统初始化时就启动或退出时自动重启的程序
语法:
service <name> <pathname> [ <argument> ]*
<option>
<option>
...
eg:
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
class main
priority -20
user root
group root readproc reserved_disk
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
3.3 Options
选项是用来修改服务的。它们影响如何及何时运行这个服务.
选项 | 描述 |
---|---|
console [<console> ] | 此服务需要一个控制台。可选的第二个参数选择特定的控制台而不是默认控制台 |
critical | 这是一项设备关键型服务。 如果它在四分钟内退出四次以上,设备将重启进入恢复模式 |
disabled | 服务不会自动运行,必须显式地通过服务器来启动。 |
setenv <name> <value> | 设置环境变量 |
socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ] | 在/dev/socket/下创建一个unix domain的socket,并传递创建的文件描述符fd给服务进程.其中type必须为dgram或stream,seqpacket.用户名和组名默认为0 |
enter_namespace <type> <path> | 输入位于_path_的_ type_类型的命名空间。 _type_设置为“net”时仅支持网络命名空间。 请注意,只能输入给定_type_的一个名称空间 |
file <path> <type> | 打开文件路径并将其fd传递给已启动的进程。 _type_必须是 “r”,“w”或“rw”。 |
user <username> | 在执行此服务之前先切换用户名。当前默认为root. |
group <groupname> [ <groupname> * ] | 类似于user,切换组名 |
capabilities <capability> [ <capability> * ] | 执行此服务时设置功能 |
setrlimit <resource> <cur> <max> | 这将给定的rlimit应用于服务 |
seclabel <seclabel> | Change to ‘seclabel’ before exec’ing this service |
oneshot | 当此服务退出时不会自动重启. |
class <name> [ <name> * ] | 给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default |
onrestart | 当服务重启时执行一条指令 |
writepid <file> [ <file> * ] | Write the child’s pid to the given files when it forks |
priority <priority> | 调度服务进程的优先级。 该值必须在范围内 -20到19。 |
3.4 Trigger
触发器用来描述一个触发条件,当这个触发条件满足时可以执行动作.
触发器 | 描述 |
---|---|
boot | 当init程序执行,并载入/init.conf文件时触发. |
<name>=<value> | 当属性名对应的值设置为指定值时触发. |
device-added-<path> | 当添加设备时触发 |
device-removed-<path> | 当设备移除时触发. |
service-exited-<name> | 当指定的服务退出时触发. |
3.5 Commands
命令 | 描述 |
---|---|
chmod <octal-mode> <path> | 更改文件访问权限 |
chown <owner> <group> <path> | 更改文件的所有者和组属性 |
class_start <serviceclass> | 启动指定类属的所有服务,如果服务已经启动,则不再重复启动. |
class_stop <serviceclass> | 停止并禁用指定类属的所有服务 |
class_reset <serviceclass> | 如果当前正在运行,则停止指定类的所有服务,而不禁用它们 |
class_restart <serviceclass> | 重启指定类的所有服务 |
copy <src> <dst> | 复制文件 |
domainname <name> | 设置域名 |
enable <servicename> | 将已禁用的服务转换为已启用的服务,就像服务未指定已禁用一样 |
exec [ <seclabel> [ <user> [ <group> * ] ] ] – <command> [ <argument> * ] | 执行指定路径下的程序,并传递参数 |
exec_background [ <seclabel> [ <user> [ <group> * ] ] ] – <command> [ <argument> * ] | 使用给定参数fork和execute命令。 这与 exec 命令的处理方式类似。 区别在于init不会停止执行命令,直到进程退出 exec_background |
exec_start <service> | 启动给定服务并停止处理其他init命令直到它返回 |
export <name> <value> | 设置全局环境参数,此参数被设置后对所有进程都有效 |
hostname <name> | 这是主机名 |
ifup <interface> | 使指定的网络接口"上线",相当激活指定的网络接口 |
insmod [-f] <path> [<options> ] | 安装模块到指定路径. |
load_all_props | 从/ system,/ vendor 等加载属性。 |
load_persist_props | 在解密/ data时加载持久性属性 |
loglevel <level> | 设置内核日志级别 |
mkdir <path> [mode] [owner] [group] | 用指定参数创建一个目录,在默认情况下,创建的目录读取权限为755.用户名为root,组名为root |
mount_all <fstab> [ <path> ]* [–<option> ] | 在给定的fs_mgr-format fstab上调用fs_mgr_mount_all并在指定路径(例如,刚安装的分区上)导入.rc文件,并带有可选选项“early”和“late”。 有关详细信息,请参阅“Init .rc文件”部分 |
mount <type> <device> <dir> [ <flag> * ] [<options> ] | 类似于linux的mount指令 |
restart <service> | 停止并重新启动正在运行的服务,如果服务当前正在重新启动,则不执行任何操作,否则,它只会启动该服务 |
rm <path> | 删除文件 |
rmdir <path> | 删除文件夹 |
setprop <name><value> | 设置属性 |
setrlimit <resource> <cur> <max> | 设置资源的rlimit |
start <service> | 如果指定的服务未启动,则启动它 |
stop <service> | 如果指定的服务当前正在运行,则停止它 |
symlink <target> <path> | 创建一个符号链接 |
sysclktz <mins_west_of_gmt> | 设置系统基准时间 |
trigger <event> | Trigger an event. Used to queue an action from another action |
umount <path> | 卸载在该路径上安装的文件系统 |
write <path> <content> | 在路径中打开文件,并使用write(2)向其写入一个字符串。 如果该文件不存在,则将创建该文件。 如果确实存在,则会被截断。 |
3.6 属性(Properties)
Init程序在运行时会更新属性系统的一些属性,提供程序内部正在执行的信息
属性 | 描述 |
---|---|
init.svc.<name> | 当前某个服务的状态(“stopped”, “stopping”, “running”, "restarting) |
ro.boottime.init | Time after boot in ns (via the CLOCK_BOOTTIME clock) at which the first stage of init started |
ro.boottime.init.selinux | 第一阶段初始化SELinux需要多长时间。 |
ro.boottime.init.cold_boot_wait | init等待ueventd的冷启动阶段结束的时间。 |
ro.boottime.<service-name> | 服务首次启动的时间 |
以上内容参考aosp/system/core/init/README.md