android机制系列之8 init进程-Zygote进程来历研究学习

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 。

  1. uevent进程

    用于设备文件节点创建

  2. 创建用户设备文件目录并挂载

    mkdir(“/dev”, 0755), /proc等等目录, 并mount /tmpfs /devpts /proc /sysfs等文件系统

  3. 初始化属性

    property_init(), process_kernel_cmdline()等

  4. 解析加载init.rc *

    init_parse_config_file(“/init.rc”);

  5. 无限循环执行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. 步骤1 从init进程中fork()出子进程,比如zygote(app_process)也是fork出来的;
  2. 步骤2 设置环境变量;
  3. 步骤3 创建socket通信;
  4. 步骤4 execve()可执行文件 如zygote,就是/system/bin/app_process被运行,执行进入app_process的main函数。

在上述步骤之前,有一个步骤0 ,会给init进程,signal_init(void) 注册了一个SIGCHLD进程退出的时候通知到父进程执行handle_signal(void)。因此,在fork以后,可以获得这个特性。

服务死的回调

  1. 查找出service_find_by_pid死亡进程;

  2. 判断非ONESHOT进程,杀死子进程;

    当子进程的服务死了之后,会根据service的标记,如果不是ONESHOT,比如zygote就没有,则会杀死该进程的所有子进程。(后面我们知道所有framework进程,app进程,都是靠zygote fork出来的,所以zygote一死,java空间进程都死了。)

  3. 删除服务创建的socket,即上面启动服务步骤3;

  4. 然后根据oneshot等信息是否重启服务,是否进入recovery。

猜你喜欢

转载自blog.csdn.net/jzlhll123/article/details/81058968