美文网首页程序员
初识Zygote进程

初识Zygote进程

作者: IT小瓯 | 来源:发表于2017-02-17 18:22 被阅读1364次

    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进程能有个总体的认识, 如果有幸给了想要深入学习的你一个良好的启发或开头, 笔者不胜欣慰. 
    欢迎留言学习, 指导. 谢谢.

    相关文章

      网友评论

        本文标题:初识Zygote进程

        本文链接:https://www.haomeiwen.com/subject/surlwttx.html