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 语句在解析当前文件时会立即展开。如果是目录,通常按文件名排序加载。
相关推荐
plainGeekDev9 小时前
文件读写(Java IO)→ Kotlin 扩展函数
android·java·kotlin
s_nshine10 小时前
释放C盘,迁移studio相关数据到其他盘
android·windows·android studio·内存·c盘
韩曙亮10 小时前
【Flutter】Flutter 中的 Android / iOS 特殊配置 ① ( 网络权限配置 | HTTP 明文传输配置 | 应用名称配置 )
android·网络·flutter·http·ios·网络权限
_李小白10 小时前
【android opencv学习笔记】Day 31:提取轮廓之Canny算法
android·opencv·学习
hashiqimiya11 小时前
每日android布局xml文件
android·xml·gitee
m0_7381207212 小时前
渗透测试基础——PHP 序列化数据结构与反序列化机制详解
android·服务器·网络·数据结构·安全·php
故渊at12 小时前
第二板块:Android 四大组件标准化学理 | 第十一篇:组件间通信(IPC)与 Binder 深度解析
android·binder·组件化·组件间通信
ZC跨境爬虫12 小时前
跟着 MDN 学JavaScript day_10:数组——数据的有序集合
android·java·开发语言·前端·javascript
消失的旧时光-194313 小时前
Kotlin 协程设计思想(九):Flow 到底是什么?为什么 suspend 函数还需要 Flow?
android·kotlin·协程·协程异常