Android设备中的两大进程,如下图


1,由init进程创建的Daemon进程
2,由
Zygote进程创建的应用程序进程


什么是Zygote?
zygote是“受精卵”的意思。在Android里,它是一个进程(java编写的)


Zygote进程怎么创建?
init进程启动完系统所需的各种daemon后,通过
app_process进程启动Zygote进程,如下图

什么app_process进程?

Zygote由java编写,不能直接由init进程启动,这时就要用到app_process进程。该进程先创建Dalvik虚拟机,再装载运行ZygoteInit类。如下图
1,init进程通过init.rc启动app_process进程
2,app_process进程创建Dalvik虚拟机
3,装载运行ZygoteInit类
4,ZygoteInit::main()函数绑定套接字,加载资源,启动SystemServer,处理新Android应用运行请求
5,Zygote进程创建完毕

Zygote作用?

执行Android的应用程序,即apk。

Tip:apk应用程序由java编写,不能以本地进程的形态运行在linux上,需运行在Dalvik虚拟机中。每个应用程序都运行在各自的虚拟机中,在linux里也表现为独立的进程。

Zygote优点?

运用类型于linux的fork克隆技术,缩短apk加载运行的时间。

那么,在Linux中创建并运行一个进程,与在Android中通过Zygote来创建并运行一个进程,有何不同?
在Linux中,新进程( 如B)是由父进程(如 A)通过fork()创建 A',子进程 A'再通过exec()将新进程B代码加载到内存,B运行。
在Android中,所有的新App进程(如Application A),都是由zygote通过fork()创建zygote', Application A 的代码被动态复制到zygote'内的dalvik虚拟机上,而后zygote'把执行流程交给 Application A , Application A 开始运行。
共同点:都用fork()创建
不同点:android应用程序A并非通过fork()来重新装载已有进程的代码区,而是被动态加载到复制出的zygote' 内的Dalvik虚拟机上。

下图是Linux创建运行新进程--流程图

下图是Android创建运行新进程(应用程序)--流程图

下图是Zygote如何运行新应用程序的流程图

[5] Zygote的更多相关文章

  1. Android源码阅读 – Zygote

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

  2. Android5.1.1源码 - zygote fork出的子进程如何权限降级

    前言 所有Android应用进程都是zygote fork出来的,新fork出来的应用进程还保持着root权限,这显然是不被允许的,所以这个fork出来的子进程的权限需要被降级,本文说的就是Andro ...

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

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

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

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

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

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

  6. Zygote浅谈

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

  7. Zygote进程【3】——SystemServer的诞生

    在ZygoteInit的main()方法中做了几件大事,其中一件便是启动Systemserver进程,代码如下: @/frameworks/base/core/Java/com/Android/int ...

  8. Zygote进程【2】——Zygote的分裂

    在Zygote的诞生一文中init进程是如何一步步创建Zygote进程的,也了解了Zygote的进程的作用.Zygote进程的诞生对于整个Java世界可以说有着"开天辟地"的作用, ...

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

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

  10. 图解Android - Zygote, System Server 启动分析

    Init 是所有Linux程序的起点,而Zygote于Android,正如它的英文意思,是所有java程序的'孵化池'(玩过星际虫族的兄弟都晓得的).用ps 输出可以看到 >adb shell ...

随机推荐

  1. uva 10054 The Necklac(欧拉回路)

    明显的欧拉回路,把颜色作为点,建图后,做一遍欧拉回路.不过我是现学的,打印路径上纠结了一下,发现随着FindEuler()的递归调用的结束,不断把点压入栈中,从后向前打印,遇到"支路&quo ...

  2. [Sciter系列] MFC下的Sciter–1.创建工程框架

    Sciter SDK中提供的Win32下例程很多,唯独使用很多(对我个人而言)的MFC框架下Sciter程序的构建讲的很少,虽然MFC有这样那样的诟病,但是不可否认的是编写一般的小项目,这仍然是大多数 ...

  3. 【linux】命令

    pwd 显示路径 whereis jupyterhub find / -name base.py reboot 重启 grep

  4. Live555中RTP包的打包与发送过程分析

    这里主要分析一下,live555中关于RTP打包发送的部分.在处理完PLAY命令之后,就开始发送RTP数据包了(其实在发送PLAY命令的response包之前,就会发送一个RTP包,这里传输就已经开始 ...

  5. 去除 waring Method 'CreateNew' hides virtual method of base type 'TCustomForm'

    最近整理前人的代码,有好多的hint和waring, 其中整理到Method 'CreateNew' hides virtual method of base type 'TCustomForm', ...

  6. java jvm学习笔记十一(访问控制器)

     欢迎装载请说明出处: http://blog.csdn.net/yfqnihao/article/details/8271665 这一节,我们要学习的是访问控制器,在阅读本节之前,如果没有前面几节的 ...

  7. codeforces 675D Tree Construction set

    转自:http://blog.csdn.net/qwb492859377/article/details/51447350 #include <stdio.h> #include < ...

  8. 如何从ST网站找到对应的固件库

    ST官方网站改版后,基本上很难搜索到固件库的地址,找了半天才找到固件库的下载地址,通过此方法可以找到其他需要的资源,故记下来方便大家. 下载的网站地址为: Home>Tools and Soft ...

  9. gcc编译器基本命令

    1 unix操作系统 ubuntu 12版本Unix内核0.5天 常用命令2 c语言:标准c 十天主要练习动手能力 小案例水平高的 自己去写案例水平低的 理解并跟着写3 c++:5天高级语言的特点:面 ...

  10. CentOS6.2编译安装codelite5.3

    这两天实验室要求在服务器上安装一个codelite,于是由我对服务器下手,上网看了下悲剧的发现codelite不支持在centos上直接安装,只能编译安装,经过一番折腾之后,成功的装上了,下面是我的安 ...