二、源码分析
对Android-2.1版本中的如下源码文件进行分析:
(1)init.c:路径为system/core/init/init.c
(2)parser.c:路径为system/core/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第一阶段(启动准备) system/core/init/init.c
在
main函数中,具体的函数调用过程如下:
mkdir->
mount->
open_devnull_stdio->
log_init
2.2第二阶段(解析init.rc文件)
在
main函数中,具体的函数调用过程如下:
init_parse_config_file->
parse_config->
parse_new_section->
parse_service(或者parse_action)->
parse_line_service(或者parce_line_action)
2.3第三阶段(触发需要执行的action)
在
main函数中,具体的调用过程如下:
action_for_each_trigger("early-init",action_add_queue_tail);->
action_add_queue_tail( class_start default)->drain_action_queue();->
action_remove_queue_head-> do_class_start
2.4第四阶段(执行在action队列中的命令)
在
main函数中,具体的调用过程如下:
execute_one_command->
action_remove_queue_head->
do_class_start->
service_for_each_class->
service_start_if_not_disabled->
service_start
2.5第五阶段(循环处理)
在
main函数中,具体的循环处理过程如下:
for (; ;) {
poll > handle_property_set_fd > handle_keychord > handle_signal
}
注意:在2.3中,其实把第4阶段和第5阶段合并在一起了。
execute_one_command也是放在这个
for (; ;)无限循环中。
2.6主要函数介绍
函数名
所在文件
功能概述
main
system/core/init/init.c
1号进程init的入口函数。主要分析init.rc配置文件,执行基本的action和启动必备的native service,然后进入一个infinite loop 处理来自property, signal的event
mkdir
system/core/init/init.c
建立文件系统的基本目录
mount
system/core/init/init.c
装载文件系统
open_devnull_stdio
system/core/init/init.c
打开基本输入、输出设备
log_init
system/core/init/init.c
初始化日志功能
init_parse_config_file
system/core/init/ parser.c
读取init.rc文件内容到内存数据区
parse_config
system/core/init/ parser.c
识别init.rc文件中的 Section(service and action series )和Text
parse_new_section
system/core/init/ parser.c
识别section类别
parse_service
system/core/init/ parser.c
对service section第一行进行分析
parse_line_service
system/core/init/ parser.c
对service section的option选项进行分析
parse_action
system/core/init/ parser.c
对action section第一行进行分析
parse_line_action
system/core/init/ parser.c
对action section的每一行独立的命令进行分析
action_for_each_trigger
system/core/init/ parser.c
触发某个action的执行
action_add_queue_tail
system/core/init/ parser.c
将某个action的从action_list加到action_queue
execute_one_command
system/core/init/init.c
执行当前action的一个command
action_remove_queue_head
system/core/init/ parser.c
从action_queue链表上移除头结点(action)
do_class_start system/core/init/ builtins.c
class_start default对应的入口函数,主要用于启动native service
service_for_each_class
system/core/init/ parser.c
遍历service_list链表上的所有结点
service_start_if_not_disabled
system/core/init/ builtins.c
判断service的flag是否disabled,如果不是,则调用相关函数,准备启动service
service_start
system/core/init/init.c
启动service的主要入口函数,设置service数据结构的相关数据结构后,调用fork创建一个新的进行,然后调用execve执行新的service
fork
Lib function(ulibc)
进程创建函数
execve
Lib function(ulibc)
调用执行新的service
poll
Lib function(ulibc)
查询property_set_fd,signal_fd和keychord_fd文件句柄是否有服务请求
handle_property_set_fd
system/core/init/property_service.c
处理系统属性服务请求,如:service, wlan和dhcp等等
handle_keychord
system/core/init/keycords.c
处理注册在service structure上的keychord,通常是启动service
handle_signal
system/core/init/signal_handler.c
处理SIGCHLD signal