Android系统启动流程之init.rc语法

一、init.rc是什么?

adnroid系统就像是是运行在linux系统上的一个“服务进程”,并不算是一个完整的操作系统。这些服务进程是维持设备正常运转的关键,而这些进程的鼻祖就是init进程。而init进程就是通过解析init.rc脚本来启动的,所以说init.rc实际上就是一个脚本文件。

二、init.rc的语法

官方文档路径: system/core/init/Readme.txt

一个完整的init.rc脚本由4种类型的声明组成:

  1. Action(动作)

  1. Commands(命令)

  1. Services(服务)

  1. Options(选项)

接下来是一些通用的语法规则:

  • 注释以 # 开头

  • 关键字和参数以空格分隔,每个语句以行为单位

  • C语言风格的 \ 转义字符可以用来为参数添加风格

  • 字符串使用 “ ”

  • 行尾的 \ 用来表示和下面一行是同一行

  • Actions(动作)和Services(服务)就是一个新语句的开始,这个两个后面跟着Commands(命令)或Options(选项)都属于这个新语句

  • Actions(动作)和Services(服务)有唯一的名字,如果出现重名就会被当成错误忽略掉

三、Actions(动作)

从下面的截图中可以看到,一个动作其实就是响应某个事件的过程。

将下图翻译一下: 当early-init这个触发条件产生时,依次执行下面的命令1、命令2、命令3、命令4

**源码实现思想:**当相应的事件发生后,系统就会对init.rc中的各个触发条件进行匹配,只要匹配成功就会把这个动作加到“命令执行队列的尾部”,等待执行。如果已经存在是不会再次添加的。

四、Commands(命令)

上面已经说过了,命令会在条件触发后一条一条的执行。

init.rc中常见的触发条件

触发条件

解释

示例

boot

这是init程序启动后触发的第一个事件

on boot

<name> = <Value>

当属性name满足特定的value时触发

on property:vold.decrypt=trigger_load_persist_props

device-added-<path>

device-removed-<path>

当设备节点添加/删除时会触发

service-exited-<name>

当指定的服务<name>存在时触发

init.rc中常见的命令

命令

描述

示例

exec <path> <arguments>

fork并执行一个程序,程序的路径为<path>。这条命令会阻塞直到该程序启动完成

# Lock the fs-verity keyring, so no more keys can be added

exec -- /system/bin/fsverity_init --lock

export <name> <value>

剩下的后面再写吧

五、Services(服务)

Services其实是可执行程序,他们在特定选项的约束下会被init程序运行或者重启。

一般格式:

Service <name> <pathname> <argument>

<option>

<option>

......

  • <name>表示service的名称

  • <pathname>表示service所在的路径

  • <argument>表示启动service所带的参数

  • <option>表示对这个service的约束选项

示例:

六、options(选项)

看了上面的内容,相信大家已经对选项不再陌生了。

综合以上的分析就能发现,其实init.rc的语法可以概括为以下形式:

on <sometime-happened>

<wait-to-do>

当某些条件触发的时候就去做某些事,怎么样是不是很简单呢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值