background image

Action(动作)进行解析。其中,Service 由命令(Command)和一系列服务的附加内容(Option,
选项

)组成,如:“service vold /system/bin/vold”为一个 Service,而“socket vold stream 0660 

root mount“则为配合该服务使用的 Option;Action 则由一系列的命令组成,如: “on init 
mkdir /system”为系统初始化时建立系统文件夹的 Action;

(3) 触发需要执行的 action:Action 需要在 Triggers(触发条件)中调用,本阶段对需要执

行的

Action 进行触发,并根据触发条件将需要执行的 Action 放入 Action 队列;

(4) 执行在 action 队列中的命令:对上一阶段触发的 Action 以及 Service 进行执行。并在

此过程中,派生了

Zygote 和 Service Manager 两个非常重要的进程;

(5) 循环处理事件:init 进程进入无限循环,处理设备插入/拔出,服务属性状态变化和

signal 事件等。

2. 源码分析结果

android-2.3.3_r1 版本中的如下源码文件进行分析:

(1) init.c:路径为 system/core/init/init.c

(2) init_parser.c:路径为 system/core/init/ init_parser.c

(3) builtins.c:路径为 system/core/init/ builtins.c

(4) property_service.c:路径为 system/core/init/property_service.c

(5) keycords.c:路径为 system/core/init/keycords.c

(6) signal_handler.c:路径为 system/core/init/signal_handler.c

总结得出系统启动流程对应的源代码文件及函数如下

(注:以下函数间的顺序执行关系

使用

“>”表示;函数间的调用执行关系使用“à”表示)

2.1 第一阶段(启动准备)

具体的函数执行过程如下:

 mkdir > mount > open_devnull_stdio > log_init

2.2 第二阶段(解析 init.rc 文件)

具体的函数调用过程如下:

  init_parse_config_fileàparse_configà  parse_new_sectionàparse_service  ( 或 者 parse_action)-> 
parse_line_service(或者 parce_line_action)