Android Zygote
Android Zygote 是 Android 操作系统中一个关键的系统服务,它在系统启动时加载,为应用程序的运行提供了一种快速且资源高效的方式。
Zygote 的主要作用如下:
-
预加载共享库和类:Zygote 启动时,会预先加载 Android 系统中所有应用程序共享的库和类,例如 Android Runtime,标准 Java 类库等。
-
应用程序进程的复制:当一个新的 Android 应用程序需要启动时,不需要从头开始初始化一个新的 Dalvik 或 ART 运行时环境,Zygote 进程会通过 fork 操作复制一份已经初始化的运行时环境。这样做可以显著减少应用程序的启动时间,并且节省系统资源。
-
提供应用程序隔离:通过 fork 出的每个进程都有自己独立的运行环境,这样就可以确保一个应用程序的崩溃不会影响到其他应用程序。
-
保持系统的稳定性:通过复用已经加载的系统资源和库,Zygote 可以保持整个系统的稳定性,不会因为某个应用程序的异常而导致系统资源的浪费。
-
权限管理:Zygote 也负责根据 Android 清单文件(AndroidManifest.xml)为每个应用程序进程设置相应的权限。
总的来说,Zygote 在 Android 系统中扮演了非常重要的角色,它确保了系统的稳定运行,同时提高了应用程序的启动效率。
Zygote 启动流程
Zygote 是 Android 系统中的一个核心服务,它在系统启动时被启动,并负责创建新的应用程序进程。Zygote 的启动过程相对复杂,它涉及到 Android 系统底层的一些机制,下面是它的大致启动流程:
-
系统启动:当 Android 系统启动时,首先会启动一个名为 “init” 的进程。这个进程负责启动系统中的其它服务,包括 Zygote。
-
Zygote 服务启动:init 进程会启动 Zygote 服务,这一过程在 init.rc 脚本文件中定义。这个脚本定义了 Zygote 服务的启动命令以及启动参数。
-
创建 socket 服务:Zygote 服务启动后,它会创建一个名为 “zygote” 的 socket 服务,这个服务负责监听来自系统其它部分的请求,例如创建新的应用程序进程。
-
预加载类和资源:Zygote 会预先加载 Android 系统中所有应用程序共享的类和资源。这些类和资源包括 Android 运行时(Android Runtime)、标准 Java 类库、系统服务等。
-
等待请求:在加载完类和资源后,Zygote 就进入等待状态,监听来自系统的新的请求。当收到请求时,Zygote 会通过 fork 操作创建新的进程。
-
fork 新进程:当 Zygote 收到请求创建新的应用程序进程时,它会通过 fork 操作复制一份已经初始化的运行时环境。然后,新的进程开始执行应用程序代码。
Zygote 的启动流程就是这样,它在 Android 系统中起到了非常重要的作用,保证了应用程序的快速启动和系统资源的有效利用。
Native Zygote启动和Java Zygote启动
Android系统中的Zygote启动过程可以被分为Native Zygote启动和Java Zygote启动两个阶段。
Native Zygote启动:
这部分主要涉及底层C/C++代码。在此阶段,会完成一些底层的系统设置和初始化工作。以下是Native Zygote启动阶段的一些主要任务:
-
创建Zygote进程:首先,Android系统的init进程会启动Zygote进程。
-
设置Zygote进程:对Zygote进程进行一系列底层的设置,包括设置进程的UID/GID、进程的capabilities等。
-
启动Dalvik/ART虚拟机:虚拟机是运行Java代码的环境,因此在这一步,Zygote进程会启动Dalvik/ART虚拟机。
-
启动Socket服务:为了接收创建新应用程序进程的请求,Zygote进程会启动一个Socket服务。
Java Zygote启动:
一旦Dalvik/ART虚拟机启动,Zygote进程就会进入Java Zygote启动阶段。在这个阶段,Zygote进程主要执行以下任务:
-
预加载Java类和资源:Zygote进程会预先加载Android系统中所有应用程序共享的Java类和资源。
-
创建系统Server进程:系统Server进程是Android系统中的一个关键进程,它负责管理各种系统级别的服务,例如窗口管理服务、活动管理服务等。Zygote进程在这一步会创建系统Server进程。
-
进入等待状态:完成上述任务后,Zygote进程会进入等待状态,等待接收来自系统的新的请求。当收到请求时,Zygote进程会通过fork操作创建新的应用程序进程。
这两个阶段的过程都是为了实现Zygote的主要功能,即高效地创建新的应用程序进程。通过预先加载共享的库和资源,以及通过复制已经初始化的运行时环境,Zygote确保了应用程序可以快速启动,而且对系统资源的占用也最小化。
Zygote启动SystemServer
-
预加载类和资源:Zygote进程在启动后,会预加载Android系统中所有应用程序共享的类和资源。这些类和资源包括Android运行时(Android Runtime)、标准Java类库、系统服务等。
-
启动SystemServer进程:在预加载完类和资源后,Zygote进程会通过fork操作创建一个新的进程,然后在这个新的进程中启动SystemServer。启动SystemServer的命令是startSystemServer。
-
加载SystemServer类:在新的进程中,Zygote会加载SystemServer类。这个类是SystemServer进程的入口点。
-
调用SystemServer的main方法:加载完SystemServer类后,Zygote会调用SystemServer的main方法。在这个方法中,SystemServer会初始化并启动各种系统服务。
-
初始化系统服务:在SystemServer的main方法中,会创建并初始化各种系统服务,例如窗口管理服务、活动管理服务等。这些服务在SystemServer进程中运行,并通过Binder提供给其他进程使用。
-
启动完成:在所有的系统服务都启动并初始化完成后,SystemServer进程的启动过程就完成了。此时,Android系统进入了完全运行状态。
注意,虽然SystemServer进程是由Zygote启动的,但是一旦启动完成,它就会在自己的进程中独立运行,不再依赖于Zygote。这是因为在Android系统中,每个应用程序和服务都在自己的进程中运行,以实现进程间的隔离和保护。
服务启动为什么不让SystemServer来做?
Zygote服务的设计原因和它的IPC通信机制选择与Android的设计哲学和优化目标有关。
Zygote服务的主要任务是预加载共享的类和库,以及使用fork创建新的应用进程。让SystemServer来完成这些任务不仅会使SystemServer的复杂度增加,而且可能影响到SystemServer的稳定性和性能。
SystemServer是Android系统中的核心服务进程,它负责管理各种系统级别的服务,如窗口管理服务、活动管理服务等。如果一个应用的启动或运行出现问题,会导致对应的Zygote孵化出的进程崩溃,但不会影响到SystemServer。如果这些任务都交给SystemServer来做,那么一旦有问题发生,可能会影响到SystemServer,从而影响到整个Android系统的稳定性。
此外,由于Zygote使用fork来创建新的应用进程,它可以在不需要重新加载类和库的情况下快速地创建新的进程。这一点是SystemServer或其他服务无法做到的,因为它们都运行在自己的进程中,无法直接复制运行时环境。
为什么Zygote的IPC通信机制不采用Binder?
Zygote的IPC通信主要是通过UNIX Socket来完成的,而不是通过Binder。这主要有以下几个原因:
简单高效:UNIX Socket通信相比于Binder来说更加简单和直接。它不需要复杂的服务注册和查找过程,也不需要复杂的数据序列化和反序列化过程。这使得UNIX Socket在启动新的应用进程时可以有更高的效率。
启动顺序:在Android系统启动的早期阶段,Binder服务可能还没有完全启动和初始化,因此这个时候不能使用Binder进行通信。而UNIX Socket不依赖于任何服务,可以在系统的任何时候使用。
安全性:Zygote服务需要接收并执行来自系统的创建新应用进程的请求。这些请求通常包含敏感的信息,例如应用的UID、GID等。使用UNIX Socket可以更好地保护这些信息的安全,防止被其他进程截获或篡改。文章来源:https://www.toymoban.com/news/detail-622292.html
总的来说,Zygote服务的设计和它的IPC通信机制选择都是为了提高Android系统的性能和稳定性,同时保护系统的安全。文章来源地址https://www.toymoban.com/news/detail-622292.html
到了这里,关于Android Framework 之 Zygote的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!