****************************************************************************
Android 4.4 init进程分析文章链接
Android 4.4 Init进程分析一 :Android init进程概述
Android 4.4 Init进程分析二 :Android初始化语言
Android 4.4 Init进程分析三:init.rc脚本文件的解析
Android 4.4 Init进程分析四 :init.rc脚本文件的执行
Android 4.4 Init进程分析五 :进程的终止与再启动
***************************************************************************
1 前言
上一篇文章中,我们简单分析了 init 进程是如何去解析init.rc文件的,最终解析得到两个链表:
- 动作列表:action_list
- 服务列表:service_list
那么得到这两个列表后,init进程又是怎么去执行这些动作及服务的呢?这篇文章中我们继续分析。
2 action动作的执行
在init进程的main函数中,调用init_parse_config_file("/init.rc")函数后得到action_list,接下来就是分析这些action怎样执行。
2.1 init进程main()函数的后续处理
我们先看看main()函数的代码片段:
http://androidxref.com/4.4_r1/xref/system/core/init/init.c#1038
1 int main(int argc, char **argv) 2 { 3 ... 4 INFO("reading config file\n"); 5 init_parse_config_file("/init.rc"); //解析init.rc文件,得到action_list and serice_list 6 7 action_for_each_trigger("early-init", action_add_queue_tail); // 把和trigger name相匹配的action放入action_queue 8 9 queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done"); // 内建action处理 10 queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng"); // 内建action处理 11 queue_builtin_action(keychord_init_action, "keychord_init"); // 内建action处理 12 queue_builtin_action(console_init_action, "console_init"); // 内建action处理 13 14 /* execute all the boot actions to get us started */ 15 action_for_each_trigger("init", action_add_queue_tail); 16 17 /* skip mounting filesystems in charger mode */ 18 if (!is_charger) { 19 action_for_each_trigger("early-fs", action_add_queue_tail); 20 action_for_each_trigger("fs", action_add_queue_tail); 21 action_for_each_trigger("post-fs", action_add_queue_tail); 22 action_for_each_trigger("post-fs-data", action_add_queue_tail); 23 } 24 25 /* Repeat mix_hwrng_into_linux_rng in case /dev/hw_random or /dev/random 26 * wasn't ready immediately after wait_for_coldboot_done 27 */ 28 queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng"); // 内建action处理 29 30 queue_builtin_action(property_service_init_action, "property_service_init"); // 内建action处理 31 queue_builtin_action(signal_init_action, "signal_init"); // 内建action处理 32 queue_builtin_action(check_startup_action, "check_startup"); // 内建action处理 33 34 if (is_charger) { 35 action_for_each_trigger("charger", action_add_queue_tail); 36 } else { 37 action_for_each_trigger("early-boot", action_add_queue_tail); 38 action_for_each_trigger("boot", action_add_queue_tail); 39 } 40 41 /* run all property triggers based on current state of the properties */ 42 queue_builtin_action(queue_property_triggers_action, "queue_property_triggers"); // 内建action处理 43 44 45 #if BOOTCHART 46 queue_builtin_action(bootchart_init_action, "bootchart_init"); // 内建action处理 47 #endif 48 49 ... 50 }