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 语句在解析当前文件时会立即展开。如果是目录,通常按文件名排序加载。
相关推荐
用户09340777351416 小时前
HarmonyOS WPS Open SDK 实践:registerApp 鉴权与就绪门禁
android·typescript·harmonyos
jike_202616 小时前
会议离线录音APP:无网络记录能力对比
android·智能手机·语音识别
always_TT17 小时前
【Python 字符串格式化:format() 方法】
android·开发语言·python
恋猫de小郭17 小时前
AI 时代,一个优化 Flutter 的重复代码工具 Deslop
android·前端·flutter
RisunJan18 小时前
Android 面试知识点整理
android·面试·职场和发展
脚踏实地,坚持不懈!18 小时前
Android ANR 内核底层全解析:从一次触摸到“应用无响应”
android·linux
xhBruce19 小时前
强制使用桌面模式 - SECONDARY_HOME -android-15.0.0_r23
android·launcher3
_祝你今天愉快1 天前
从驱动来分析服务的添加过程
android
Dovis(誓平步青云)1 天前
折叠屏悬停看视频,上半屏和下半屏应该各做什么
android·java·服务器·开发语言·安全·音视频
alexhilton1 天前
让架构边界变成可执行的测试
android·kotlin·android jetpack