Android 系统启动之启动脚本加载过程

131 阅读2分钟

0 引言

  Android 系统启动过程中在执行SecondStageMain函数时,内部比较重要的一个过程就是“启动脚本加载过程”,它会读取系统内部的.rc文件,然后将它们解析成动作action和服务service,并将它们保存到统一的管理位置ActionManager和ServiceList。.rc文件的格式和模样大致如下图所示 (本博客的分析过程基于android13_r16版本。)

image.png

image.png

  LoadBootScripts这个函数是本篇文章主要分析的函数,它位于SecondStageMain函数中。

image.png

  整个过程可以总结成下面这张图:

image.png

1 启动脚本加载过程

  进入LoadBootScripts首先是调用CreateParser函数来生成三种类型的SectionParser,分别是ServiceParser、ActionParser和ImportParser。这说明我们在写.rc文件时,只有这三种类型的Section(段落)。分别指示一个服务、一种动作和导入其他的rc文件这三种功能。

image.png

  创建完解析器,就可以开始读取.rc文件了。主要会读取/system/etc/init/hw/init.rc文件,以及在 /system/etc/init、/system_ext/etc/init、/vendor/etc/init、/odm/etc/init和/product/etc/init这些目录下的rc文件。

image.png

  读取到这些文件后会被解析成字符串std::string,然后送往ParseData函数中去解析。

image.png

  ParseData函数内部解析过程稍微有些复杂,但大概的思路就是先逐行解析数据,每一行又按照空格来分割成参数数组args[]。如果第一个参数是"on"则接下来调用ActionParser来解析该片段(Section),如果第一个参数是"service"则调用ServiceParser,如果是"import"则调用ImportParser。通过这三个解析器就可以得到一个个的action和servie。

image.png

  在每个Section被解析完成后,就会把action加入到ActionManager中,service加入到ServiceList中,这样就完成了整个的解析过程。至于内部具体怎么被解析,其实并不重要,我们把它当作黑盒来看待就行了。

  总结就是:该过程的输入是一个个的.rc文件,输出是一个个的action和service,然后它们被加入到ActionManager中和ServiceList中。