Android init进程启动过程分析
田海立@CSDN
2013-3-16
本文分析Android中init进程的执行过程,只是分析init进程启动的流水,具体细节在今后的各个专题中再分别详细分析。本文虽是后面各个专题的基础,读者初看可能理解不深,可以在阅读后面各个专题的时候,结合本文的整体流程会有更清晰的理解。
Init进程从 /system/core/init/init.c里的main()函数开始
1. mkdir && mount
2. import_kernel_cmdline
从内核中通过/proc/cmdline导入下列命令行参数,这些参数会分别被设置到各个属性值中:
/* execute all the boot actions to getus started */ action_for_each_trigger("init",action_add_queue_tail); action_for_each_trigger("early-fs", action_add_queue_tail); action_for_each_trigger("fs",action_add_queue_tail); action_for_each_trigger("post-fs",action_add_queue_tail); queue_builtin_action(property_service_init_action,"property_service_init"); queue_builtin_action(signal_init_action,"signal_init"); queue_builtin_action(check_startup_action,"check_startup"); /* execute all the boot actions to get usstarted */ action_for_each_trigger("early-boot", action_add_queue_tail); action_for_each_trigger("boot",action_add_queue_tail); /* run all property triggers based oncurrent state of the properties */ queue_builtin_action(queue_property_triggers_action,"queue_propety_triggers"); 9. 进入无限循环中for(;;)
9.1 execute_one_command():[system/core/init/init.c]
1) 从action_queue取下structaction *act赋给cur_action;
2) 从cur_action获得struct command *赋给cur_command;
3) 执行cur_command->func(cur_command->nargs, cur_command->args)
注1:以上是第一次执行时,如果action中还有command,就不需要1,而2中就是直接再在action上取下一条command即可。
注2:这里才是真正地命令的执行,前面的action_for_each_trigger()和queue_builtin_action()只是加入到action_queue队列中,而这里是从队列中顺序取出,并执行。
所以,加入队列action_queue的顺序也就决定了执行的顺序。Init???.rc中action所在的section决定了它们执行的先后次序:early-init -> init -> early-fs -> fs -> post-fs ->early-boot -> boot。
9.2 restart_processes():system/core/init/init.c
对有SVC_RESTARTING标志的service,执行restart_service_if_needed()
9.3 用poll等待几个事件:property事件/子进程结束的signal事件/keychord
9.4 处理等到的事件
对property_set事件,调用handle_property_set_fd()处理;
对keychord事件,调用handle_keychord()处理;
对signal事件,调用handle_signal()处理;
总结:
本文分析了Android里的init进程的启动过程,从中可以知道init做的主要工作包括对init.rc的解析,property机制的实现,service支撑的实现。详细细节在后面的专题中讨论。