一.rc语法规则
-
.rc是init进程启动的配置文件 ,使用 Android Init Language(Android初始化语言)编写
-
.rc文件由一个一个的Section组成
-
Section分为3类:
- 以import开头,导入其他rc文件
- Action,以on开头
- Service,以service开头
-
由空格分隔的标记组成每一行。可以使用双引号来防止空格将文本分割成多个标记
-
行尾的
\表示续行符(下一行内容接在当前行后) -
以
#开头的行(或行内的#之后)为注释。 -
on后面可以跟一个trigger判断条件和多个属性判断条件,使用
&&连接。 -
文件名通常为
<service_name>.rc或init.<device>.rc
二.Action
action的格式如下:
on <trigger> [&& <trigger>]*
<command>
<command>
<command>
以on开头,trigger是判断条件,当满足trigger判断条件时,依次执行下面的command。
三.command
- start <service>: 启动服务(如果已运行则忽略)。
- stop <service>: 停止服务。
- restart <service>: 重启服务。
- class_start <class_name>: 启动指定类别的所有服务。
- class_stop <class_name>: 停止指定类别的所有服务。
- class_reset <class_name>: 停止指定类别的所有服务并重置状态。
- enable <service>: 将服务状态从 disabled 改为 enabled(下次 class_start 会启动它)。
- exec [ <user> [ <group> ] ] -- <command> [ <args> ]*: fork 并执行命令。会阻塞 init 进程,直到命令返回。
- exec_background: 同上,但不会阻塞(异步)。
- mkdir <path> [ <mode> [ <owner> [ <group> ] ] ]: 创建目录。
- chmod <mode> <path>: 修改权限。
- chown <owner> <group> <path>: 修改所有者。
- write <path> <content>: 向文件写入字符串。
- copy <src> <dst>: 复制文件。
- rm <path>: 删除文件。
- rmdir <path>: 删除目录。
- symlink <target> <path>: 创建软链接。
- mount <type> <device> <dir> [ <mountflags> <options> ]: 挂载文件系统。
- umount <path>: 卸载。
- setprop <name> <value>: 设置系统属性。
- hostname <name>: 设置主机名。
- ifup <interface>: 启动网络接口。
- insmod <path>: 加载内核模块 (.ko)。
- load_system_props: 加载 /system/build.prop 等属性文件。
- sysclktz <minutes_west>: 设置系统时钟基准。
- trigger <event>: 触发另一个action 。
- wait <path> [ <timeout> ]: 阻塞等待某个文件存在(通常设超时,默认5秒)。
- sleep <seconds>: 休眠(慎用,会卡住 init)。
- loglevel <level>: 设置内核日志等级。
三.Service
services的格式如下:
service <name> <pathname> [ <argument> ]*
<option>
<option>
以service开头,name为服务的名称,pathname为服务的可执行二进制文件路径,argument表示执行文件带的参数,option表示这个服务的一些配置。
四.常用的options
- class <name> [ names ]: 指定服务所属的类别。常用值:core, main, hal, late_start。默认属于 default 类。class_start 命令会以此为依据启动一批服务。
- user <username>: 设置进程的用户 ID。默认为 root。
- group <groupname> [groups]: 切换进程的组 ID。第一个是主组,后面可跟多个附属组。
- socket <name> <type> <perm> [ <user> [ <group> ] ]: 创建一个 UNIX 域套接字 /dev/socket/<name>,并将 fd 传递给进程。类型通常是 stream (TCP-like) 或 dgram (UDP-like)。
- file <path> <type>: 打开一个文件路径并传递 fd 给进程。
- oneshot: 服务退出后不自动重启。常用于一次性脚本。
- disabled: 服务不会随 class_start 自动启动。必须显式通过 start <name> 命令启动。
- onrestart: 当服务重启时,执行后续的命令(如重置依赖的进程),例如:onrestart restart other_service。
- seclabel <context>: 显式指定 SELinux 上下文。通常在 .te 文件中定义,这里较少手动写。
- capabilities <cap> ...: 赋予 Linux Capabilities(如 NET_ADMIN)。这是比直接用 root 更安全的做法。
- interface <interface_name> <instance_name>: (Android 10+) 声明该服务提供特定的 AIDL/HIDL 接口。用于 Lazy Start(当有客户端请求该接口时才启动服务)。
- priority <priority>: 设置进程调度优先级(-20 到 19)。
- oom_score_adjust <value>: 设置 OOM(内存不足杀手)的评分 (-1000 到 1000)。值越低越不容易被杀。
- keycodes <keycodes...>: 指定触发该服务的组合键(通常用于 adb 或特定调试服务)。
- memcg.limit_in_bytes <value>: 限制内存控制组的大小。
- shutdown <behavior>: 指定关机时的行为。critical (关机时不杀,等待超时), shutdown (正常杀)。
五.import
- import <path>: 导入特定的 rc 文件。
- import <directory>: 导入该目录下的所有
.rc文件。 - import 语句在解析当前文件时会立即展开。如果是目录,通常按文件名排序加载。