1. init过程
简单地学习下,android的init进程的来历和它干了些什么。并且引出大名鼎鼎的zygote的来历。鸣谢帖子。
http://www.cnblogs.com/nokiaguy/archive/2013/04/14/3020774.html
https://blog.csdn.net/ttxgz/article/details/7411788
https://blog.csdn.net/zhonglunshun/article/details/78615980
https://blog.csdn.net/hu3167343/article/details/38299969
《深入理解android卷1》
http://androidxref.com/ android2.3和android5.1源码。
init 概述:
电源起来,引导BootLoader,linux内核启动。
开始拉起用户空间(?)的第一号进程 init进程
。即system/core/init/init.c 。
uevent进程
用于设备文件节点创建
创建用户设备文件目录并挂载
mkdir(“/dev”, 0755), /proc等等目录, 并mount /tmpfs /devpts /proc /sysfs等文件系统
初始化属性
property_init(), process_kernel_cmdline()等
解析加载init.rc *
init_parse_config_file(“/init.rc”);
无限循环执行command(启动其他进程)。是从init*rc等一堆rc里面读取文件创建的列表中循环。
for(;;) { //无限循环 execute_one_command(); restart_processes(); ... poll(ufds, fd_count, timeout); //等待新指令 }
还包含开机动画。
解析init.rc
init.rc四种类型,Actions行为,Commands命令,Services服务,Options选项。
这里面有很多的东西,其中之一很重要的Zygote。(学习补充:虽然Zygote是很重要的,并不代表他是init进程中第一个初始化的,事实上在大部分情况进程号已经500之后)。
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
struct service
struct listnode slist;
struct socketinfo *sockets;
...
const char *name;
chost char *classname;
rc文件被读取以后,将所有的service都添加到链表service_list中。这些服务通信使用的是socket。
init进程启动服务:在init.c for(;;)里面
步骤1
从init进程中fork()出子进程,比如zygote(app_process)也是fork出来的;步骤2
设置环境变量;步骤3
创建socket通信;步骤4
execve()可执行文件 如zygote,就是/system/bin/app_process被运行,执行进入app_process的main函数。
在上述步骤之前,有一个步骤0
,会给init进程,signal_init(void) 注册了一个SIGCHLD进程退出的时候通知到父进程执行handle_signal(void)
。因此,在fork以后,可以获得这个特性。
服务死的回调:
查找出service_find_by_pid死亡进程;
判断非ONESHOT进程,杀死子进程;
当子进程的服务死了之后,会根据service的标记,如果不是ONESHOT,比如zygote就没有,则会杀死该进程的所有子进程。(后面我们知道所有framework进程,app进程,都是靠zygote fork出来的,所以zygote一死,java空间进程都死了。)
删除服务创建的socket,即上面启动服务步骤3;
然后根据oneshot等信息是否重启服务,是否进入recovery。