注:android启动过程博文参考源码4.0.3
android启动过程主要是system/core/init/init.c文件。按照上一篇日志《android启动过程》可以总结出,启动过程主要有以下四个步骤:解析两个配置文件(init.rc是关键);执行各个阶段的动作;初始化属性,启动属性服务;进入无限循环等待一些事情的发生。主要完成了两件事情:创建了关键进程zygote;提供了属性服务property service。其中,事情1是在步骤2中完成的;事情2是在步骤3中完成的。
本篇主要讲步骤1,如何解析配置文件init.rc.
一. init.rc的结构
init.rc文件在system/core/rootdir/,网上有很多讲这个文件的文章,这里总结一下:
初始化语言有四大类声明组成:action行为类、command命令类、service服务类、options选项类。
其中,action和service隐含声明一个section段落。该段落下的command和option是属于该段落的。
action:是一系列命令的命名,拥有一个trigger触发器来决定action何时执行。表现形式为:
on <trigger>
<command>
<command>
<command>
......
trigger是触发器,是一个字符串,用来匹配某种类型的事件并执行一个action
command就是要执行的命令
service:由init启动,退出时可以重启。表现形式为:
service <name> <pathname> [<argument>]*
<option>
<option>
.......
可以看到,option是service的修饰,影响init何时、如何运行service。
二.解析init.rc的函数
在init.c中,可以看到这样一个步骤: init_parse_config_file("/init.rc");这个函数就是解析init.rc的操作。我们来学习这个函数。
init_parser.c中:init_parse_config_file()函数使用read_file()读取配置文件的内容,之后用parse_config()做真正的解析。
init_parser.c中:parse_config()创建并初始化了一个parse_state类型的结构体,之后进入一个for循环,这个循环的作用是遍历配置文件的每个section,针对不同的section做解析操作。可以看到,对配置文件的section的解析是由函数parse_new_section()完成的。
init_parser.c中:parse_new_section()根据关键字的类型做解析。由前面init.rc的结构分析可知,section由action和service声明。因此在此函数中,对关键字做switch,分别对以on开头的action和以service开头的service做处理。其中,对on的处理,对应整个init步骤2——执行各个阶段的动作;对service的处理,对应整个init步骤3——属性服务。
对on的处理:可以看到init.c中主要的动作处理顺序是early_init、init、early_boot、boot。函数action_for_each_trigger()和函数queue_builtin_action()表示把对应section的command加入到执行的队列,然后按序执行队列中的命令。
对service的处理:请参考下一篇博文《android启动过程详解(二)——解析service》