zoukankan      html  css  js  c++  java
  • Zygote(app_process)相关分析1

    首先我们从Init.c中来看,当Init中解析完init.rc文件时会得到一系列的action,通过action去调用一些函数。

    Zygote是在init.rc中service section中

    1. service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server  

     在parse_new_section()中会解析init.rc文件,最后会添加到相应的链表中。

    service 关键字定义的服务将会添加到 service_list 链表中。
    on      关键开头的项将会被会添加到 action_list 链表中。
    

    1.在init.c中执行

    action_for_each_trigger(“boot”,…);  //创建zygote是从boot阶段开始。
    drain_action_queue()
    

    以上是执行action_list 中的命令:
        从action_list 中取出 act->name ,再调用 action_add_queue_tail(act)将其插入到队列 action_queue 尾部。

        drain_action_queue() 从action_list队列中取出队列项 ,然后执行act->commands列表中的所有命令。

    init.rc中COMMAND    

    class_start default  
    

    在添加到service_list 链表中时   svc->classname = "default";

    default 启动所有service 关键字定义的服务。

    class_start 被触发会调用do_class_start();

    2.do_class_start()中会执行

    service_for_each_class(args[1],..);  //从service_list 链表中获取service后启动。
    service_start(svc, NULL);    //service_start_if_not_disabled的被启动。
    

    3.接着会调用service_start()

    •   此函数中init中fork出一个进程。
    •   根据socketinfo创建socket(zygote stream 666)。
    •   利用execve函数来执行zygote的可执行文件/system/bin/app_process。

    这样app_process的main函数就被启动起来了。也就是ZygoteZygote的启动就这样分析完了。

    接下来分析一下zygote的onrestart。

    4.重启zygote

    1.     子进程(zygote)退出时会调用sigchld_handler(),此函数中会往signal_fd中写数据。
    2.      这时init进程的socket会接收信息。就会从init中的poll函数中返回。(signal_fd是在init中通过socketpair创建的两个socket中的一个。)
    3.     flag设置为SVC_RESTARTING后执行service的onresatart中的COMMAND。
    4.     poll()中返回后,会进入新的循环,会通过flag重启所有RESTARTING的svc。
            drain_action_queue();
            restart_process();
    

    最后又被service_start函数重启了。

  • 相关阅读:
    (转载)Rime输入法—鼠须管(Squirrel)词库添加及配置
    (转载)Windows下小狼毫输入法(Rime)的安装与配置(含导入搜狗词库)
    (转载)WinCC 卸载后 Simatic Shell 的删除
    (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)
    (转载)一张表搞清楚西门子S7系列标准DB块与优化DB块
    (转载)Navicat Premium 12.1.16.0安装与激活
    (转载)MySQl数据库-批量添加数据的两种方法
    (转载)用C#实现MySQL建库及建表
    设置MYSQL数据库编码为UTF-8
    [设计模式]工厂方法模式(Factory Method)
  • 原文地址:https://www.cnblogs.com/hongguang-kim/p/4813412.html
Copyright © 2011-2022 走看看