注:android启动过程博文参考源码4.0.3

android启动过程主要是system/core/init/init.c文件。按照上一篇日志《android启动过程》可以总结出,启动过程主要有以下四个步骤:解析两个配置文件(init.rc是关键);执行各个阶段的动作;初始化属性,启动属性服务;进入无限循环等待一些事情的发生。主要完成了两件事情:创建了关键进程zygote;提供了属性服务propertyservice。其中,事情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. Android 源码分析-Dalvik 虚拟机创建过程
  2. 初次体验Android,过程很艰辛!
  3. Android应用程序(APK)的编译打包过程
  4. Android Scroll详解(三):Android 绘制过程详解
  5. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

随机推荐

  1. 游戏开发完整学习路线,都在这里了
  2. Java文件上传实例并解决跨域问题
  3. 盘点市面上主流的时序数据库
  4. TCP协议为什么需要三次握手?
  5. Html基本语法
  6. HTML表单内容的详细介绍
  7. html练习之表单标签使用
  8. 学习基本元素布局视窗
  9. 怎么给网站建立一级目录
  10. 如何优化网站权重页?