04_rc文件语法规则

一.rc语法规则
  • .rc是init进程启动的配置文件 ,使用 Android Init Language(Android初始化语言)编写

  • .rc文件由一个一个的Section组成

  • Section分为3类:

    • 以import开头,导入其他rc文件
    • Action,以on开头
    • Service,以service开头
  • 由空格分隔的标记组成每一行。可以使用双引号来防止空格将文本分割成多个标记

  • 行尾的 \ 表示续行符(下一行内容接在当前行后)

  • # 开头的行(或行内的 # 之后)为注释。

  • on后面可以跟一个trigger判断条件和多个属性判断条件,使用&&连接。

  • 文件名通常为 <service_name>.rcinit.<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 语句在解析当前文件时会立即展开。如果是目录,通常按文件名排序加载。
相关推荐
祖国的好青年2 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴3 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle
小米渣的逆袭3 小时前
Android ADB 完全使用指南
android·adb
儿歌八万首3 小时前
Jetpack Compose Canvas 进阶:结合 animateFloatAsState 让自定义图形动起来
android·动画·compose
zhangphil4 小时前
Android Page 3 Flow读sql数据库媒体文件,Kotlin
android·kotlin
神探小白牙4 小时前
echarts,3d堆叠图
android·3d·echarts
李白的天不白4 小时前
如何项目发布到github上
android·vue.js
summerkissyou19874 小时前
Android-RTC、NTP 和 System Time(系统时间)
android
小书房5 小时前
Kotlin使用体验及理解1
android·开发语言·kotlin