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.ActionAction的格式如下:
Android初始化语言中定义Action的Trigger如表3-1所示。
除了表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.ServiceService的格式如下:
4.OptionAndroid初始化语言中定义的Option如表3-3所示。
Section是一个虚拟的概念,它在init.rc中并不显式存在。每一个Action或Service隐含是一个Section,每一个Section代表一个完整的功能,init.rc便是由不同的Section组成的。