****************************************************************************
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文件,获得服务列表service_list,而后从列表中依次启动服务子进程。
init进程启动的主要进程如下:
- sh: 搭载Android的机器终端,连接串口或adbd时,提供控制台输入输出的shell程序。
- adbd: 指Android Debug Bridge,原来管理QEMU模拟器或实际机器的状态。该工具运行在目标机器(模拟器或物理机器)上,充当服务器,PC充当连接服务器的客户端。
- servicemanager: 是Android比较正要的一个进程,在init进程启动后启动,用来管理系统中的服务。
- vold: 指Volume Dameon,用来挂载/管理USB存储或SD卡设备。
除了以上这些进程外,init进程还启动其他多种进程。若init启动的某个进程终止,则会对系统的运行产生影响。比如“服务管理器”(servicemanager),它是应用程序使用系统服务必须运行的进程。如果该进程出现意外终止,那么进程间的通信、图像输出、音频输出等功能都将无法使用。因此在init启动的进程中,除了一小部分外,其它大部分进程出现意外终止时,init进程都要重新启动它们。
通过前面两篇文章的分析,我们已经知道init进程会启动服务列表中的服务,创建相应的子进程。当子进程意外终止时,会向父进程init进程传递SIGCHLD信号,init进程接收到该信号后,检查进程选项是否设置为oneshot,若设置为oneshot,init进程放弃重启进程;否则重启进程。
关于init进程如何重启子进程,接下来详细分析
2 进程再启动代码分析
关于进程(service)的重启,我们还要从init进程的main()函数说起,在main()函数中有一个“内建action”: signal_init
http://androidxref.com/4.4_r1/xref/system/core/init/init.c#1065
1 queue_builtin_action(signal_init_action, "signal_init");
当init进程执行这个action时就回去调用signal_init_action()函数:
http://androidxref.com/4.4_r1/xref/system/core/init/init.c#800
1 static int signal_init_action(int nargs, char **args) 2 { 3 signal_init(); 4 return 0; 5 }
进而调用到signal_init()函数:
http://androidxref.com/4.4_r1/xref/system/core/init/signal_handler.c#131
1 void signal_init(void) 2 { 3 int s[2]; 4 5 struct sigaction act; 6 memset(&act, 0, sizeof(act)); 7 act.sa_handler = sigchld_handler; 8 act.sa_flags = SA_NOCLDSTOP; 9 sigaction(SIGCHLD, &act, 0); 10 11 /* create a signalling mechanism for the sigchld handler */ 12 if (socketpair(AF_UNIX, SOCK_STREAM, 0, s) == 0) { 13 signal_fd = s[0]; 14 signal_recv_fd = s[1]; 15 fcntl(s[0], F_SETFD, FD_CLOEXEC); 16 fcntl(s[0], F_SETFL, O_NONBLOCK); 17 fcntl(s[1], F_SETFD, FD_CLOEXEC); 18 fcntl(s[1], F_SETFL, O_NONBLOCK); 19 } 20 21 handle_signal(); 22 }