Zygote进程你不知道的东西

程序员小迷 2024-07-28 12:06:41

一、概述

1.Zygote(孵化) 进程是所有 Android进程的父进程,包括SystemServer和各种应用进程都是通过Zygote进程fork出来的。Zygote进程相当于Android系统的根进程,系统启动后所有的进程都是通过这个进程fork出来的。这样做的好处是:每个新应用进程都可以从Zygote进程继承已经初始化好的虚拟机环境、共享虚拟机内存、框架层资源和系统资源(包括内存空间中的代码、数据和其他资源),从而加快应用启动速度。

2.虽然 Zygote 进程相当于 Android系统的根进程,但事实上它也是由 Linux系统的init进程(进程号为1)启动的。Init进程在解析init.rc脚本时,会启动Zygote进程。

3.Zygote进程的优先级被设置为最高,以确保快速准备好系统环境。若Zygote进程异常退出,init进程会将其重新启动。

4.在 ART 时代,Zygote 会预先进行 AOT(Ahead of Time)编译,将热点代码转换为机器码,减少应用程序运行时的开销。

5.Zygote进程运行在一个沙箱环境中。

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

Linux系统的init 进程 --> Android系统的Zygote 进程 --> Android系统的SystemServer 进程 --> Android系统中要启动的各种应用进程

二、各进程的作用

1.init进程:Linux的根进程,Android系统是基于Linux系统的,因此可以算作是整个Android操作系统的第一个进程。

2.Zygote 进程:Android 系统的根进程,主要作用: fork 出Android系统的SystemServer 进程和各种应用进程。

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

4.各种应用进程:启动自己编写的应用时,一般都是重新启动一个应用进程,有自己的虚拟机与运行环境。

三、Zygote 进程解析

1.源码位置

frameworks/base/core/java/com/Android/internal/os/ZygoteInit.java

2.Zygote进程的main方法

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

1)  创建并启动ART虚拟机实例。初始化 DDMS。

2)  注册 Zygote 进程的 socket 通讯。

3)  初始化 Zygote 中的各种类,资源文件,OpenGL,类库,Text 资源等。

4)  初始化完成之后 fork 出 SystemServer(名称为system_server) 进程。

5)  fork 出 SystemServer 进程之后,关闭 socket 连接。进入等待状态,准备接收来自SystemServer或AMS(Activity Manager Service)的请求以创建新应用进程。

3.ZygoteInit  类的 main  方法

1) init 进程在启动 Zygote 进程时一般都会调用 ZygoteInit 类的 main 方法。

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

3) 之后初始化各种参数。

4) 通过调用 registerZygoteSocket 方法,为 Zygote 进程注册 Socket。

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

6) 然后调用 startSystemServer 开启 SystemServer 服务。

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

0 阅读:2

程序员小迷

简介:致力于Android、iOS、C、Java等编程技术的技巧经验分享