android启动过程详解(一)——解析init.rc

注: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》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值