jollen 發表於 April 5, 2010 3:14 PM

Android 作業系統開機時,會經由 init.rc 來啟動許多外部程式,其中有一個最重要 process 稱為 Zygote。Zygote 是 Android 的 monitor process,它主要負責二項工作:

1. 啟動 system server
2. 執行 Android 應用程式

「System Server」是由 Zygote 所建立的另外一個 process,建立 system server 的方式是使用典型的 Linux system call - fork()。當 Zygote 成功建立 system server 後,便進入 socket listening 模式。在此模式下,zygote 會監聽(listen)由 socket 所傳入的「命令」,並依據命令的內容啟動 Android 應用程式。

Zygote 啟動外部 Android 應用程式的方式,同樣是使用 Linux kernel 所提供的 fork() system call。因此,在 socket 做 listening,並依據命令來 fork() 並執行外部 Android 應用程式,稱之為「Zygote Mode」。

    android的系统应用中的一个重要的进程就是zygote,所有的java应用程序进程都是由zygote派生出来的,zygote这个进程的作用就是“生儿子”。具体的一个应用如何出来的大家可以看我以前的一篇文章-----Android 应用初始化及窗体事件的分发。

   首先要了解一点初始化语言的基本知识吧:

Services(服务)是一个程序,他在初始化时启动,并在退出时重启(可选)。Services(服务)的形式如下:

       service <name> <pathname> [ <argument> ]*
          <option>
          <option>
Options为选项,具体可以参考linux service命令

zygote进程正是在linux kernel startup后通过这个文件启动的,具体看init.rc中这一段:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    socket zygote stream 666
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on

一段一段的分析这个代码:

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

启动服务名字zygote.   /system/bin/app_process 进程的bin文件具体路径,后面跟的就是启动参数-Xzygote /system/bin --zygote --start-system-server。这段参数有什么作用可以对照看代码app_main.cpp

if (i < argc) {
        arg = argv[i++];
        if (0 == strcmp("--zygote", arg)) {
            bool startSystemServer = (i < argc) ?
                    strcmp(argv[i], "--start-system-server") == 0 : false;
            setArgv0(argv0, "zygote");
            set_process_name("zygote");
           runtime.start("com.android.internal.os.ZygoteInit",
                startSystemServer);
        } else {
            set_process_name(argv0);

            runtime.mClassName = arg;

            // Remainder of args get passed to startup class main()
            runtime.mArgC = argc-i;
            runtime.mArgV = argv+i;

            LOGV("App process is starting with pid=%d, class=%s./n",
                 getpid(), runtime.getClassName());
            runtime.start();
        }
    }

-Xzygote 这个参数的意义是在jvm中设置gDvm.zygote = true;至于这个参数的具体作用大家自己看代码吧。 其流程是 androidRuntime->start() call---> JNI_CreateJavaVM() call ---->dvmStartup()(戴维林虚拟机初始化) call---->dvmProcessOptions().

/system/bin :也许是告知系统应用的路径吧,大家看到了告诉我。

onrestart write /sys/android_power/request_state wake:

如果这个服务重启了,打开/sys/android_power/request_state 这个文件写入wake字符串。

Zygote Service

在本章我们会接触到这两个单词:

•Zygote [生物] 受精卵, 接合子, 接合体
•Spawn:产卵
通过这两个单词,我们就可以大体知道Zygote是干什么的了,就是叫老母鸡下蛋。通过“Zygote”产出不同的子“Zygote”。从大的架构上讲,Zygote是一个简单的典型C/S结构。其他进程作为一个客服端向Zygote发出”孵化”请求,Zygote接收到命令就“孵化”出一个Activity进程来。

Zygote系统代码组成及其调用结构:
•Zygote.java
  提供访问Dalvik “zygote”的接口。主要是包装Linux系统的Fork,以建立一个新的VM实例进程。
•ZygoteConnection.java
  Zygote的套接口连接管理及其参数解析。其他Actvitiy建立进程请求是通过套接口发送命令参数给Zygote。
•ZygoteInit.java
  Zygote的main函数入口。

Zygote系统代码层次调用

main()

Startsystemserver()…

RunSelectLoopMode()

Accept socket connection

Conntecion.RunOnce()

Read argument

folkAndSpecialize

folkAndSpecialize使用Native函数Dalvik_dalvik_system_Zygote_forkAndSpecialize

//native 的获取
 dalvik/vm/native

//dalvik_system_Zygote.c

const DalvikNativeMethod dvm_dalvik_system_Zygote[] = {

{ "fork",            "()I",

Dalvik_dalvik_system_Zygote_fork },

{ "forkAndSpecialize",            "(II[II[[I)I",

Dalvik_dalvik_system_Zygote_forkAndSpecialize },

{ "forkSystemServer",            "(II[II[[I)I",

Dalvik_dalvik_system_Zygote_forkSystemServer },

{ NULL, NULL, NULL },

};

在这里我们就有了Zygote服务的全貌理解,也在Code中印证了,Activity在本质上是个什么东西,就是一个Linux进程。但是不是一个简单的Linux进程,毕竟Activity是在Andoid概念空间中才有效的。在这个概念空间中,Activity被包装,在屏幕上呈现UI,用户看到的整个屏幕或者一个窗口,对于机器来讲,呈现在用户面前的就叫Actvitiy。从分析中我们可以看到,Android使用了Linux的fork机制。在Linux中Fork是很高效的。

一个Android的Activity实际上一个Linux进程,所谓进程具备下面几个要素,
 a.要有一段程序供该进程运行,程序是可以被多个进程共享的。

b..进程专用的系统堆栈空间。
 c.进程控制块,在linux中具体实现是task_struct
 d.有独立的存储空间。

fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容,在复制过程中,子进程复制了父进程的task_struct,系统堆栈空间和页面表,而当子进程改变了父进程的变量时候,会通过copy_on_write的手段为所涉及的页面建立一个新的副本。所以只有子进程有改变变量时,子进程才新建了一个页面复制原来页面的内容,基本资源的复制是必须的,整体看上去就像是父进程的独立存储空间也复制了一遍。

再看看下面Google在讲解Dalvik虚拟机的图片,我们就大体有了Android系统中Actvitiy的实际映射状态有了基本的认识。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/maxleng/archive/2010/04/20/5508488.aspx

android 的Zygote 分析相关推荐

  1. Android源码分析 - Zygote进程

    开篇 本篇以android-11.0.0_r25作为基础解析 上一篇文章Android源码分析 - init进程,我们分析了Android第一个用户进程init进程的启动过程和之后的守护服务 init ...

  2. Android内存泄漏分析及调试

    2019独角兽企业重金招聘Python工程师标准>>> Android内存泄漏分析及调试 分类: Android2013-10-25 11:31 5290人阅读 评论(5) 收藏 举 ...

  3. Android 系统(74)--Android重启原因分析

    Android重启原因分析 重启原因分类 1.上层造成重启 system_server被杀 watchdog重启 重要线程阻塞 2.kernel造成重启 空指针 非法地址 3.kernel watch ...

  4. android释放acitity内存,Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  5. android挂载usb设备,android usb挂载分析---MountService启动

    在android usb挂载分析----vold启动,我们的vold模块已经启动了,通信的机制也已经建立起来了,接下来我们分析一下MountService的启动,也就是我们FrameWork层的启动, ...

  6. Android源码分析-全面理解Context

    前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像 ...

  7. Android Studio +MAT 分析内存泄漏实战

    点击打开链接 对于内存泄漏,在Android中如果不注意的话,还是很容易出现的,尤其是在Activity中,比较容易出现,下面我就说下自己是如何查找内存泄露的. 首先什么是内存泄漏? 内存泄漏就是一些 ...

  8. Android源码分析--MediaServer源码分析(二)

    在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...

  9. Android系统启动流程分析之安装应用

    2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295)  (0)  举报  收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...

最新文章

  1. 如果我有jQuery背景,那么“ AngularJS中的思考”吗? [关闭]
  2. 全志uboot修改_全志SDK编译问题解决二:build uboot only
  3. (转)Cobbler无人值守批量安装Linux系统
  4. Js原生元素选择器 _$获取id class attr 属性集合
  5. 搞定操作系统面试,看这篇就够了(二)
  6. 8051 r0-r7 是什么
  7. IDEA配置hadoop依赖jar包(非Maven)
  8. CS231n——机器学习算法——线性分类(上: 线性分类器)
  9. 【5G NR】SSB
  10. STC12C5A60S2 双串口
  11. ZooKeeper示例 实时更新server列表
  12. XCode14 iOS16适配 pod签名
  13. 劳务员培训建筑八大员培训劳务员对劳务分包企业管理的建议
  14. element 时间选择器 限制时分秒_关于elementUI里日期选择器禁用时间的一些小技巧...
  15. MAP(Maximum A Posteriori,最大后验准则)算法
  16. Android内存泄露抓取工具leakcanary
  17. 中国下一代互联网(CNGI)建设市场投资前景预测与发展战略规划研究报告2021~2027年
  18. webgl第27课-三维空间-不同位置的三角形
  19. 设立测绘地理信息安全保密工作机构
  20. 计算机考研专业课938,中国地质大学938《分析化学》2018考研大纲

热门文章

  1. windows下使用nvcc和nvprof
  2. opencv中imread函数的使用
  3. JavaScript 实现web随机数排序、整除、重置
  4. 如何在win10安装libaio,并且使用CFLAGS和LDFLAGS环境变量指示其位置,并且如何设置DS_BUILD_AIO=0禁用async_io...
  5. 上传文件到gitee仓库的步骤
  6. RGB转YUV420,支持NV12(420p)和NV21(420sp)
  7. 大点干!早点散----------深入剖析GFS分布式文件系统
  8. 如何查看内核版本和ubuntu版本
  9. python 上传图片到七牛云上
  10. 【Hadoop】P2 Hadoop简介