美文网首页
Android Zygote(孵化) 进程总结

Android Zygote(孵化) 进程总结

作者: 宇辰妈咪 | 来源:发表于2021-01-26 10:39 被阅读0次

    1.什么是 Zygote 进程?

    Zygote 进程是所有的 android 进程的父进程,包括 SystemServer 和各种应用进程都是通过 Zygote 进程 fork 出来的。Zygote(孵化)进程相当于是 android 系统的根进程,后面所有的进程都是通过这个进程 fork 出来的,虽然 Zygote 进程相当于 Android 系统的根进程,但是事实上它也是由 Linux 系统的 init进程启动的。

    Android 各个进程的先后启动顺序:

    init 进程 --> Zygote 进程 --> SystemServer 进程 -->各种应用进程

    进程作用说明:

    (1).init进程:linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程;

    (2). Zygote 进程:android 系统的根进程,主要作用:可以作用 Zygote 进程 fork 出SystemServer 进程和各种应用进程;

    (3).SystemService 进 程 : 主 要 是 在 这 个 进 程 中 启 动 系 统 的 各 项 服 务 , 比 如ActivityManagerService,PackageManagerService,WindowManagerService服务等等;

    (4).各种应用进程:启动自己编写的客户端应用时,一般都是重新启动一个应用进程,有自己的虚拟机与运行环境,一般进程名和包名维持一致;

    2.Zygote 进程的启动流程

    以高通SM6115平台Android R 源码代码为例,Zygote进程的源码位置:
    LA.UM.9.15/LINUX/android/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    Zygote 进程 main 方法主要执行逻辑:

    • 初始化 DDMS;

    • 注册 Zygote 进程的 socket 通讯;

    • 初始化 Zygote 中的各种类,资源文件,OpenGL,类库,Text 资源等等;

    • 初始化完成之后 fork 出 SystemServer 进程;

    • fork 出 SystemServer 进程之后,关闭 socket 连接;

     ZygoteInit 类的 main 方法

    init 进程在启动 Zygote 进程时一般都会调用 ZygoteInit 类的 main 方法,这里看一下该方法的具体实现(基于 androidAPI 30 源码);

    • 调用preForkInit()进行初始化,设置DDMS可用,可以发现DDMS启动的时机还是比较早的,在整个 Zygote 进程刚刚开始要启动额时候就设置可用。

    • 之后初始化各种参数,

    • 然后调用 preload 方法实现预加载各种资源

    • 然后通过调用 "start-system-server"库,设置startSystemServer 为true开启 SystemServer 服务,这个是重点(通过Zygote fork出来,参数为socket和socketserver)

    启动systemserver后调用closeServerSocket关闭socket。

    3.SystemServer 进程启动流程

    SystemServer 进程简介

    SystemServer 进 程 主 要 的 作 用 是 在 这 个 进 程 中 启 动 各 种 系 统 服 务 , 比 如ActivityManagerService,PackageManagerService,WindowManagerService 服务,以及各种系统性的服务其实都是在 SystemServer 进程中启动的,而当我们的应用需要使用各种系统服务的时候其实也是通过与 SystemServer 进程通讯获取各种服务对象的句柄的。

    SystemServer 的 main 方法

    /*** The main entry point from zygote.*/

        public static void main(String[] args) {

            new SystemServer().run();

        }

    如上所示,main方法只是 new 出一个 SystemServer 对象并执行其 run 方法,查看SystemServer 类的定义我们知道其实 final 类型的,所以我们一般不能重写或者继承。

    首先设置系统当前时区,语言环境等默认配置、

    • 然后设置虚拟机运行内存,加载运行库,设置 SystemServer 的异步消息,初始化系统参数,调用 createSystemContext()方法,创建 context。

    然后是mSystemServiceManager 的创建,看 run 方 法 中 , 通 过 SystemServiceManager 的构造方法创建了一个新的

    SystemServiceManager 对象,我们知道 SystemServer 进程主要是用来构建系统各种service 服务的,而 SystemServiceManager 就是这些服务的管理对象。

    • 将 SystemServiceManager 对象保存 SystemServer 进程中的一个数据结构中。

    后面开始执行:

    // Start services.try {

    startBootstrapServices();

    startCoreServices();

    startOtherServices();

    } catch (Throwable ex) {

    Slog.e("System", "******************************************");

                Slog.e("System", "************ Failure starting system services", ex);

                throw ex;

            } finally {

                t.traceEnd(); // StartServices

            }

    里面主要涉及了是三个方法:

    • startBootstrapServices() 主要用于启动系统 Boot 级服务

    • startCoreServices() 主要用于启动系统核心的服务

    • startOtherServices() 主要用于启动一些非紧要或者是非需要及时启动的服务。

    4.启动服务

    启动哪些服务呢?在开始执行启动服务之前总是会先尝试通过 socket 方式连接 Zygote 进程,在成功连接

    之后才会开始启动其他服务。

    通过源码我们可以看出,mSystemServiceManager 是系统服务管理对象,在 main 方法中已经创建完成,这里我

    们看一下其 startService 方法的具体实现:

    • 可以看到通过反射器构造方法创建出服务类,然后添加到 SystemServiceManager

    的 服 务 列 表 数 据 中 , 最 后 调 用 了 service.onStart() 方 法 , 因 为 传 递 的 是Installer.class。

    Installer installer = mSystemServiceManager.startService(Installer.class);

    看一下 Installer 的 onStart 方法:

    • 很简单就是执行了 mInstaller 的 waitForConnection 方法,这里简单介绍一下

    Installer 类,该类是系统安装 apk 时的一个服务类,继承 SystemService(系统服

    务的一个抽象接口),需要在启动完成 Installer 服务之后才能启动其他的系统服务。

    继续看 startBootstrapServices 方法:

    这 段 代 码 主 要 是 用 于 启 动 ActivityManagerService 服 务 , 并 为 其 设 置SysServiceManager 和 Installer。ActivityManagerService 是系统中一个非常重要的服务,Activity,service,Broadcast,contentProvider 都需要通过其余系统交互。

    首先看一下 Lifecycle 类的定义:

    • 可以看到其实 ActivityManagerService 的一个静态内部类,在其构造方法中会创建一个 ActivityManagerService,通过刚刚对 Installer 服务的分析我们知道,SystemServiceManager 的 startService 方法会调用服务的 onStart()方法,而在Lifecycle 类的定义中我们看到其 onStart()方法直接调用了 mService.start()方法,mService 是 Lifecycle 类中对 ActivityManagerService 的引用

    启动部分服务:

    启动 PowerManagerService 服务:

    • 启动方式跟上面的 ActivityManagerService 服务相似都会调用其构造方法和onStart 方法,PowerManagerService 主要用于计算系统中和 Power 相关的计算,然后决策系统应该如何反应。同时协调 Power 如何与系统其它模块的交互,比如没有用户活动时,屏幕变暗等等。

    mPowerManagerService =mSystemServiceManager.startService(PowerManagerService.class);

    • 然后是启动 LightsService 服务

    • 主要是手机中关于闪光灯,LED 等相关的服务;也是会调用 LightsService 的构造方法和 onStart 方法;

    mSystemServiceManager.startService(LightsService.class);

    • 然后是启动 DisplayManagerService 服务

    • 主要是手机显示方面的服务

    mDisplayManagerService =mSystemServiceManager.startService(DisplayManagerService.class);

    • 然后是启动 PackageManagerService,该服务也是 android 系统中一个比较重要的服务

    包括多 apk 文件的安装,解析,删除,卸载等等操作。

    • 可以看到 PackageManagerService 服务的启动方式与其他服务的启动方式有一些区别,直接调用了 PackageManagerService 的静态 main 方法

    进一步查看PackageManagerService的main方法,可以看到也是直接使用 new 的方式创建了一个 PackageManagerService对象,

    并在其构造方法中初始化相关变量,最后调用了 ServiceManager.addService方法,主要是通过 Binder 机制与 JNI 层交互。

    然后查看 startCoreServices 方法:

    • 可以看到这里启动了 BatteryService(电池相关服务),UsageStatsService,WebViewUpdateService 服务等。

    总结:

    • SystemServer 进程是 android 中一个很重要的进程由 Zygote 进程启动;

    • SystemServer 进程主要用于启动系统中的服务;

    • SystemServer 进程启动服务的启动函数为 main 函数;

    • SystemServer 在执行过程中首先会初始化一些系统变量,加载类库,创建 Context 对象,创建 SystemServiceManager 对象等之后才开始启动系统服务;

    • SystemServer 进程将系统服务分为三类:boot 服务,core 服务和 other 服务,并逐步启动。

    • SystemServer 进程在尝试启动服务之前会首先尝试与 Zygote 建立 socket 通讯,只有通讯成功之后才会开始尝试启动服务;

    • 创建的系统服务过程中主要通过 SystemServiceManager 对象来管理,通过调用服务对象的构造方法和 onStart 方法初始化服务的相关变量;

    • 服务对象都有自己的异步消息对象,并运行在单独的线程中;

    相关文章

      网友评论

          本文标题:Android Zygote(孵化) 进程总结

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