首先我们从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函数就被启动起来了。也就是Zygote。Zygote的启动就这样分析完了。

接下来分析一下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函数重启了。

Zygote(app_process)相关分析1的更多相关文章

  1. android手机各大分区详解

    1. bootloader  当我们拿到一款手机,第一件事应该就是按下电源键开机,那么从开机到进入到桌面程序这中间发生了些什么呢,我们从下面这张简化了的手机结构图开始: 注意:该结构图并不反映手机的实 ...

  2. Zygote(app_process)相关分析2

    在前一篇文章中已经分析了从init.c到Zygote(app_process)的启动流程. 今天开始分析frameworks/base/cmds/app_process/app_main.cpp. s ...

  3. 系统进程 zygote(三)—— app_process 的 main 函数

    ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 首先: , , , ) < ) { // Older kernels don't understand ...

  4. Android源码阅读 – Zygote

    @Dlive 本文档: 使用的Android源码版本为:Android-4.4.3_r1 kitkat (源码下载: http://source.android.com/source/index.ht ...

  5. 系统进程 zygote(一)—— 概述

    和蔼的春光,充满鸳鸯的池塘:快辞别寂寞的梦乡,来和我摸一会鱼儿,折一枝海棠.—— 徐志摩·醒!醒! ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 先看一张 ...

  6. 系统进程 zygote(二)—— zygote.rc 脚本

    夕阳已在沉沉的淡化,这黄昏的美,有谁能描画?莽莽的天涯,哪里是我的家,哪里是我的家?爱人呀,我这般的想着你,你那里可也有丝毫的牵挂?—— 徐志摩·海边的梦 ilocker:关注 Android 安全( ...

  7. Zygote浅谈

    Zygote是什么 操作系统中,进程实际上是文件到地址空间的映射像.进程将要运行时,由操作系统将其映射到地址空间,完成这项工作的事物本质也应是一个进程,我们称这个进程为孵化进程,那么这个进程怎么收到消 ...

  8. Zygote进程【1】——Zygote的诞生

    在Android中存在着C和Java两个完全不同的世界,前者直接建立在Linux的基础上,后者直接建立在JVM的基础上.zygote的中文名字为"受精卵",这个名字很好的诠释了zy ...

  9. [Android] 解析android framework下利用app_process来调用java写的命令及示例

    reference to :http://bbs.9ria.com/thread-253058-1-1.html 在android SDK的framework/base/cmds目录下了,有不少目录, ...

随机推荐

  1. 覆盖原有div或者Input的鼠标移上去描述

    <input  onmouseover="this.title='我是描述内容'" />

  2. infusion度量金字塔数据解释

    inFusion能够探测超过20中代码味道和代码缺陷,包括重复代码,破坏封装的类(如数据类或者万能类),高耦合的方法和类,以及一些设计不合理的类继承结构.当我们使用inFusion工具分析代码时,在分 ...

  3. WWF3状态机工作流<WWF第七篇>

    状态机是另外一种常见的工作流类型.它是以状态的变迁为驱动而进行业务流转的,是一定需要人为干预的,而不像顺序类型工作流那样可以按照事先设计好的业务流程一步一步依次执行下去. 一.状态机工作流范例 Sta ...

  4. 【Linux】freetds安装配置连接MSSQL

    我使用的是freetds-0.91,下载地址:http://pan.baidu.com/s/1hq68rZY 安装编译(根据需要unixodbc): [root@zabbixserver / ]# t ...

  5. c#实现每隔规定时间自动执行程序代码

    c#实现每隔规定时间自动执行程序代码  在一般的项目中我们很少用到c#实现每隔规定时间自动执行程序代码,但是如果你经历的项目多,或者应用程序做的比较多的话,c#实现每隔规定时间自动执行程序代码就用的比 ...

  6. 微信JS-SDK]微信公众号JS开发之卡券领取功能详解

    js sdk: http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.952-.E6 ...

  7. TP-Link访问策略

    参考资料: http://service.tp-link.com.cn/detail_article_111.html

  8. .net分页控件webdiyer:AspNetPager

    首先下载:AspNetPager.dll   AspNetPager.xml  放到bin目录下 页面添加<%@ Register Assembly="AspNetPager" ...

  9. javaSE第十七天

    第十七天    168 1:登录注册案例(理解)    169 A:用户注册案例的分析    169 B:用户注册案例的源码    170 1: cn.itcast.pojo.User.java    ...

  10. 数据库mysql的基本命令

    问题分析 当数据量很大的时候,所有数据都集中在一个文本文件中的话,读写会很困难,内存消耗大,速度很慢 操作很麻烦,因为读写都要根据指定的格式尽心解析,不通用 每次获取数据都要全部数据重新读写,不能通过 ...