系统进程 zygote(一)—— 概述
和蔼的春光,充满鸳鸯的池塘;快辞别寂寞的梦乡,来和我摸一会鱼儿,折一枝海棠。—— 徐志摩·醒!醒!
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287
先看一张图 (android boot sequence,出处不详):
android 的底层是 linux kernel,由 bootloader 负责加载。kernel 启动后,首先启动 init 进程,再由 init 进程依次启动系统所需的其他进程,包括 zygote 进程。
由 init 启动的进程在“system\core\rootdir\root.rc”脚本中都有描述:
再来看 zygote.rc (以 init.zygote32.rc 为例):
这段脚本要求 init 进程创建一个名为 zygote 的进程,该进程要执行的程序是“/system/bin/app_process”。并且为 zygote 进程创建一个 socket 资源 (用于进程间通信,ActivityManagerService 就是通过该 socket 请求 zygote 进程 fork 一个应用程序进程)。
后面的“--zygote”是传给 app_process 的参数,表示启动的是 zygote 进程。在 app_process 的 main 函数中会依据该参数决定执行 ZygoteInit 还是 Java 类,后面的笔记再继续学习。
zygote 进程在初始化时会启动虚拟机,并加载一些系统资源。这样 zygote fork 出子进程后,子进程也继承了能正常工作的虚拟机和各种系统资源,接下来只需装载 apk 文件的字节码就可以运行应用程序了,可以大大缩短应用的启动时间,这就是 zygote 进程的主要作用。
Java 应用程序不能直接以本地进程的形态运行,必须在一个独立的虚拟机中运行。如果每次都重新启动虚拟机,将严重拖慢应用程序的启动速度。
Linux 的进程都是 fork 出来的,fork 出的子进程与父进程共享内存映像。只有当子进程改写内存时,操作系统才会为其分配一个新页面,并将老页面上的数据复制一份到新页面,这就是“写时拷贝(Copy On Write)”。
学习资料:(1)http://blog.csdn.net/luoshengyang/article/details/6768304 (2)《Android 框架揭秘》(3)《深入解析 Android 5.0 系统》