初识Zygote进程

Zygote进程, 一个在Android系统中扮演重要角色的进程. 我们知道Android系统中的两个重要服务PackageManagerService和ActivityManagerService, 都是由SystemServer进程启动的, 而这个SystemServer进程本身是Zygote进程在启动的过程中fork出来的. 这样一来, 想必我们就知道Zygote进程在Android系统中的重要地位了.

通过这篇文章, 我们可以一起了解一下Zygote进程. 它是什么? 它是怎么来的? 它都做了什么?

什么是Zygote? Zygote是Android系统中特有的进程, 不过说白了也只是名字特有而已, 言外之意, 不多说了. 总之我们先搞清楚一件事, Zygote一个最主要的作用, 就是加快Android应用程序启动和运行速度. 

为什么这么说? 这就要知道Zygote进程在启动时做了什么. Zygote进程运行时, 会初始化Dalvik虚拟机, 并运行它. Android的应用程序是由Java编写的, 它们不能直接运行在Linux上, 只能运行在Dalvik虚拟机中. 并且, 每个应用程序都运行在各自的虚拟机中, 应用程序每次运行都要重新初始化并启动虚拟机, 这个过程会消耗相当长时间, 是拖慢应用程序的原因之一. 因此, 在Android中, 应用程序运行前, 通过Zygote进程共享已运行的虚拟机的代码与内存信息, 缩短应用程序运行所耗费的时间. 也就是说, Zygote进程会事先将应用程序要使用的Android Framework中的类与资源加载到内存中, 并组织形成所用资源的链接信息. 这样, 新运行的Android应用程序在使用所需资源时不必每次形成资源的链接信息, 这样就大大提升了程序的运行时间.

所以我们知道了, 原来Zygote进程起到了预加载资源和类到虚拟机提高应用程序提高的作用. 

想知道它是什么时候创建的吗? 了解Linux系统的伙伴一定猜到了, 没错, 就是init进程. 我们知道, Android系统时基于Linux内核的, 而在Linux系统中, 所有的进程都是init进程的子孙进程.

zygote进程是由init进程创建各种deamon后创建的, 他可以启动运行Android服务和应用程序.
zygote进程启动时会初始并运行虚拟机, 而后将所需要的类和资源加载到内存中, 新进程创建的时候可以直接使用这些类和资源, 大大加快启动运行数速度, 这就是cow技术.

所以, Zygote进程就是init进程fork出来的. 但是, Zygote是由java编写而成的, 所以也要先初始化虚拟机, 由app_process进程装载并运行ZygoteInit类. 

我们先来看看app_process是如何装载并运行ZygoteInit的, 之后再来看看Zygote进程它做了什么. 

app_process创建一个AppRuntime变量,然后调用它的start成员函数, 由于AppRuntime类没有重写start函数, 所以调用的是其父类AndroidRuntime中的start函数. 在这个start函数中, 它干了三件事: 一是调用函数startVM启动虚拟机,二是调用函数startReg注册运行ZygoteInit时需要调用的JNI本地方法,三是调用了com.android.internal.os.ZygoteInit类的main函数.

说白了, 以上的一切都是为了ZygoteInit类的main函数的运行, 来启动Zygote进程. 这个函数里就是Zygote进程正真做的事情,

ZygoteInit类的功能
1. 调用registerZygoteSocket()绑定套接字, 接收新的Android应用程序运行请求, 用来和ActivityManagerServer通讯. 说的详细一点就是创建LocalServerSocket实例(也就是Socket的服务端)接收生成新Android进程的信息. 每一个新的Android应用程序进程的创建都要通过Socket请求Zygote进程(即Socket的客户端).
2. 调用preloadClasses()和preloadResource()来加载Android Application Framework使用的类与资源. 这里就是Zygote预加载资源和类, 提高Android应用程序启动速度的点.
3. 第三步调用startSystemServer()运行SystemServer进程, 来启动各种服务.
4. 最后一步调用runSelectLoopMode()来循环监听, 与第一步对应. 


这就是笔者对Zygote进程初识, 最后还是借用罗老师的总结:
1. 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。
2. Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService。
3. 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。


本文旨在给读者对Zygote进程能有个总体的认识, 如果有幸给了想要深入学习的你一个良好的启发或开头, 笔者不胜欣慰. 
欢迎留言学习, 指导. 谢谢.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容