且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《Android的设计与实现:卷I》——第3章 3.4init.rc文件解析过程

更新时间:2022-09-14 11:45:16

3.4 init.rc文件解析过程

init.rc文件按照一定的格式组织,要分析init.rc文件的解析过程,首先要熟悉它的格式。init.rc的文件格式由Android初始化语言(Android Init Language)定义,所以这里首先分析Android初始化语言。

3.4.1 Android初始化语言

Android初始化语言定义了六个基本概念、两个基本关键字和多个指令关键字。

六个基本概念分别是Section、Action、Service、Trigger、Command、Option。

两个基本关键字是on和service。

指令关键字则定义在Trigger、Command和Option中。

其帮助文档位于/system/core/init/readme.txt,其关键字定义位于/system/core/init/keyword.h。
关键字on用来声明一个Action。

关键字service用来声明一个Service。

每一个Action或者Service都隐含是一个Section,init.rc就是由不同的Section组成的。

Command是最小的功能单位,代表一个Linux命令或者一个方法调用。

Trigger代表一个自定义的触发条件,用来触发Action的执行,也可以认为它是Action的名称。

一个Action便是由关键字on声明、由Trigger触发的一组Command序列。

Option是Service的修饰符,由它来指定何时、如何启动Service程序。

每一个Service都是init进程的子进程,由关键字service、服务名、服务对应的命令的路径、命令的参数和Option组成,代表一些要在初始化阶段启动的程序。

下面将分别介绍上述几个基本概念的组成格式。

1.Action
Action的格式如下:

《Android的设计与实现:卷I》——第3章 3.4init.rc文件解析过程

Android初始化语言中定义Action的Trigger如表3-1所示。


《Android的设计与实现:卷I》——第3章 3.4init.rc文件解析过程

除了表3-1中列举的Trigger外,还有在代码中显式使用的Trigger,它们并没有列入Android初始化语言定义的Trigger中。比如可以在init.rc中搜索到early-init、init、charger、nonencrypted、post-fs-data、post-fs、fs等Trigger,这些Trigger其实是当作Action名字使用。

2.Command

Android初始化语言中定义的Command如表3-2所示。

3.Service
Service的格式如下:

《Android的设计与实现:卷I》——第3章 3.4init.rc文件解析过程
《Android的设计与实现:卷I》——第3章 3.4init.rc文件解析过程

4.Option
Android初始化语言中定义的Option如表3-3所示。


《Android的设计与实现:卷I》——第3章 3.4init.rc文件解析过程

Section是一个虚拟的概念,它在init.rc中并不显式存在。每一个Action或Service隐含是一个Section,每一个Section代表一个完整的功能,init.rc便是由不同的Section组成的。