(2) 解析init.rc文件:该阶段对init.rc脚本文件进行解析,主要对Service(服务)和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 第一阶段(启动准备)
具体的函数执行过程如下:
mkdi **《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】** r > 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) |
2.3 第三阶段(触发需要执行的action)
具体的调用过程如下:
action_for_each_trigger("boot", action_add_queue_tail);à action_add_queue_tail ( class_start default) à action_remove_queue_head à do_class_start |
2.4 第四阶段(执行在action队列中的命令)