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 \ \[ \ ] -- <command> \ *: fork 并执行命令。会阻塞 init 进程,直到命令返回。
  • exec_background: 同上,但不会阻塞(异步)。
  • mkdir <path> \ \[ \ \[ \ ] ]: 创建目录。
  • chmod <mode> <path>: 修改权限。
  • chown <owner> <group> <path>: 修改所有者。
  • write <path> <content>: 向文件写入字符串。
  • copy <src> <dst>: 复制文件。
  • rm <path>: 删除文件。
  • rmdir <path>: 删除目录。
  • symlink <target> <path>: 创建软链接。
  • mount <type> <device> <dir> \ \ : 挂载文件系统。
  • 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> \ : 阻塞等待某个文件存在(通常设超时,默认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> \ \[ \ ]: 创建一个 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 语句在解析当前文件时会立即展开。如果是目录,通常按文件名排序加载。
相关推荐
weiggle25 分钟前
第八篇:ViewModel + Compose——生产级状态管理实践
android
恋猫de小郭5 小时前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
plainGeekDev7 小时前
ButterKnife → ViewBinding
android·java·kotlin
成都大菠萝20 小时前
Android Car CarProperty 车辆信号链路
android
敲代码的鱼21 小时前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
时光足迹1 天前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app
Coffeeee1 天前
闲聊几句,Android老哥们,你们多久没做技改需求了
android·程序员·代码规范
萝卜er1 天前
Fragment 生命周期与状态恢复-《Android深水区(四)》
android
萝卜er1 天前
Intent 显式、隐式与 PendingIntent-《Android深水区(五)》
android
Kapaseker1 天前
一文吃透 Kotlin 集合操作符
android·kotlin