在本章我们会接触到这两个单词:
通过这两个单词,我们就可以大体知道 Zygote 是干什么的了,就是叫老母鸡下蛋。通过“ Zygote ”产出不同的子“ Zygote ”。从大的架构上讲, Zygote 是一个简单的典型 C/S 结构。其他进程作为一个客服端向 Zygote 发出 ”孵化”请求, Zygote 接收到命令就“孵化”出一个 Activity 进程来。
Zygote 系统代码组成及其调用结构:
提供访问 Dalvik “zygote”的接口。主要是包装 Linux 系统的 Fork ,以建立一个新的 VM 实例进程。
Zygote 的套接口连接管理及其参数解析。其他 Actvitiy 建立进程请求是通过套接口发送命令参数给 Zygote 。
Zygote 的 main 函数入口。
Zygote 系统代码层次调用
main()
Startsystemserver()…
RunSelectLoopMode()
Acceptsocketconnection
Conntecion.RunOnce()
Readargument
folkAndSpecialize
folkAndSpecialize 使用 Native 函数 Dalvik_dalvik_system_Zygote_forkAndSpecialize
//native 的获取
dalvik/vm/native
//dalvik_system_Zygote.c
constDalvikNativeMethoddvm_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 的实际映射状态 有了基本的认识。