当前位置: 首页 > news >正文

【init.rc】Android Init Language (AIL) 语法参考手册 - 指南

【init.rc】Android Init Language (AIL) 语法参考手册 - 指南

在线文档:https://android.googlesource.com/platform/system/core/+/android16-release/init/README.md
AOSP目录:system/core/init/README.md

Android 的 init.rc 语法并非标准的 Shell 脚本,它是由 Android 独有的 init 进程解析器处理的。它的语法主要分为五大类:Actions (动作)Commands (命令)Services (服务)Options (选项)Imports (导入)


一、 基本格式规则

  1. 基于行:每行包含一个指令。
  2. Token:通过空格分隔。如果参数包含空格,需用双引号 "" 包裹。
  3. 反斜杠:行尾的 \ 表示续行符(下一行内容接在当前行后)。
  4. 注释:以 # 开头的行(或行内的 # 之后)为注释。
  5. 变量扩展:支持 ${property.name} 语法,解析时会被替换为对应的系统属性值。

二、 Services (服务)

服务是 init 进程启动并管理的程序(守护进程)。

语法格式:

service   [  ]*

常用 Options (服务选项)

这些选项定义了服务的运行方式、权限和重启策略。

选项关键字说明
class <name>指定服务所属的类别。常用值: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 <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 (正常杀)。

三、 Actions (动作)

Action 是带名字的命令序列,由 Trigger (触发器) 触发。

语法格式:

on  [&& ]*...
1. 生命周期 Triggers (按时间顺序)

init 进程启动后会依次触发以下阶段:

  • early-init: 最早期初始化(加载 init.rc 之前)。
  • init: 主要初始化阶段。
  • early-fs: 文件系统挂载前。
  • fs: 挂载分区。
  • post-fs: 挂载后,系统目录已创建。
  • post-fs-data: /data 挂载并解密完成(创建数据目录)。
  • early-boot: 启动核心服务前。
  • boot: 启动完成,主服务开始运行。
2. 属性 Triggers
3. 其他 Triggers
  • device-added-<path> / device-removed-<path>: 设备插拔事件。
  • service-exited-<name>: 某服务退出时。

四、 Commands (命令)

这些是写在 Action 内部的具体执行指令。

1. 服务控制类
  • 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: 同上,但不会阻塞(异步)。
2. 文件与目录类
3. 系统与属性类
  • setprop <name> <value>: 设置系统属性。
  • getprop: (通常不在 rc 中直接用,而是通过 ${} 变量扩展)。
  • hostname <name>: 设置主机名。
  • ifup <interface>: 启动网络接口。
  • insmod <path>: 加载内核模块 (.ko)。
  • load_system_props: 加载 /system/build.prop 等属性文件。
  • sysclktz <minutes_west>: 设置系统时钟基准。
4. 流程控制与调试

五、 Imports (导入)

用于模块化管理配置。

  • import <path>: 导入特定的 rc 文件。
  • import <directory>: 导入该目录下的所有 .rc 文件。

解析顺序
import 语句在解析当前文件时会立即展开。如果是目录,通常按文件名排序加载。


六、 变量扩展 (Variable Expansion)

你可以在命令参数中使用 ${} 来引用系统属性。

示例:

# 如果 ro.hardware 是 "qcom"
import /vendor/etc/init/hw/init.${ro.hardware}.rc
# 解析为: import /vendor/etc/init/hw/init.qcom.rc

七、 常见组合示例

1. 写一个开机脚本
# 定义服务
service my_script /vendor/bin/my_script.shclass mainuser rootgroup rootoneshotdisabled
# 定义触发器
on property:sys.boot_completed=1start my_script
2. 修改内核节点权限
on early-boot# 允许 system 用户写入 CPU 频率节点chown system system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freqchmod 0664 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

八、总结

掌握 init.rc 的核心在于理解 Trigger(何时触发)Service Option(如何运行)

  • Actions 定义了系统启动的时间轴。
  • Commands 是时间轴上具体执行的指令。
  • Services 是后台常驻的工人。
http://www.jsqmd.com/news/98907/

相关文章:

  • Kotaemon为何成为GitHub热门开源框架?
  • 程序员必藏:传统技术扛不动了?大模型才是新饭碗
  • 非接触热成像仪 实时成像,多接口兼容便携多功能
  • Cherry Studio联动GPT-SoVITS实现剧本语音自动化
  • EmotiVoice开源TTS引擎使用指南
  • 2025年除臭剂口碑排行榜:进口知名品牌与平价优选推荐 - 品牌推荐大师1
  • Wan2.2-T2V-A14B服务雪崩?反脆弱LLM运维指南
  • Windows 10下Anaconda环境安装OpenCV-Python指南
  • Excalidraw入驻DooTask,开启任务与手绘协作新时代
  • 翻斗雨量监测站:精准感知降水动态
  • SAP S4HANA显示CDS View的结构以及数据
  • 数据标注平台对院校/企业而言,有什么应用价值?
  • FaceFusion开源换脸工具使用全指南
  • EPLAN电气设计:解决EPLAN卡顿的实用技巧
  • 如何轻松管理多个Blender版本:告别切换烦恼的终极解决方案
  • 用LangFlow搭建个人知识库的完整指南
  • stable-diffusion-webui中DeepDanbooru标签自动生成指南
  • 基于SpringBoot和Vue的机票预定系统的设计与实现-计算机毕业设计源码+LW文档分享
  • 49、基于 Web 的待办事项列表应用:todolist.pl 详解
  • Anything-LLM集成HuggingFace镜像构建企业级RAG
  • 玩转S3 / Supabase分析的Data Agent
  • 50、Perl编程:深入示例与函数详解
  • 2025最新最全!蓝队护网初级面试题合集!
  • Rockchip AI部署实战:RKNN-Toolkit2高效应用全解析
  • LobeChat能否生成二维码?实用小功能上线
  • Cax Beta 阶段发布
  • ECS机器上安装docker
  • 在VSCode中高效绘制示意图的利器Excalidraw
  • 30天卖了10-25万,分享一个抖音男装赛道起号新思路
  • PaperXie 打破文献综述 “堆料怪圈”:从 “作者观点清单” 到 “研究缺口导航图” 的 2025 新写法