Android Framework 之 Zygote

Android Zygote

Android Zygote 是 Android 操作系统中一个关键的系统服务,它在系统启动时加载,为应用程序的运行提供了一种快速且资源高效的方式。

Zygote 的主要作用如下:

  1. 预加载共享库和类:Zygote 启动时,会预先加载 Android 系统中所有应用程序共享的库和类,例如 Android Runtime,标准 Java 类库等。

  2. 应用程序进程的复制:当一个新的 Android 应用程序需要启动时,不需要从头开始初始化一个新的 Dalvik 或 ART 运行时环境,Zygote 进程会通过 fork 操作复制一份已经初始化的运行时环境。这样做可以显著减少应用程序的启动时间,并且节省系统资源。

  3. 提供应用程序隔离:通过 fork 出的每个进程都有自己独立的运行环境,这样就可以确保一个应用程序的崩溃不会影响到其他应用程序。

  4. 保持系统的稳定性:通过复用已经加载的系统资源和库,Zygote 可以保持整个系统的稳定性,不会因为某个应用程序的异常而导致系统资源的浪费。

  5. 权限管理:Zygote 也负责根据 Android 清单文件(AndroidManifest.xml)为每个应用程序进程设置相应的权限。

总的来说,Zygote 在 Android 系统中扮演了非常重要的角色,它确保了系统的稳定运行,同时提高了应用程序的启动效率。

Zygote 启动流程

Zygote 是 Android 系统中的一个核心服务,它在系统启动时被启动,并负责创建新的应用程序进程。Zygote 的启动过程相对复杂,它涉及到 Android 系统底层的一些机制,下面是它的大致启动流程:

  1. 系统启动:当 Android 系统启动时,首先会启动一个名为 "init" 的进程。这个进程负责启动系统中的其它服务,包括 Zygote。

  2. Zygote 服务启动:init 进程会启动 Zygote 服务,这一过程在 init.rc 脚本文件中定义。这个脚本定义了 Zygote 服务的启动命令以及启动参数。

  3. 创建 socket 服务:Zygote 服务启动后,它会创建一个名为 "zygote" 的 socket 服务,这个服务负责监听来自系统其它部分的请求,例如创建新的应用程序进程。

  4. 预加载类和资源:Zygote 会预先加载 Android 系统中所有应用程序共享的类和资源。这些类和资源包括 Android 运行时(Android Runtime)、标准 Java 类库、系统服务等。

  5. 等待请求:在加载完类和资源后,Zygote 就进入等待状态,监听来自系统的新的请求。当收到请求时,Zygote 会通过 fork 操作创建新的进程。

  6. fork 新进程:当 Zygote 收到请求创建新的应用程序进程时,它会通过 fork 操作复制一份已经初始化的运行时环境。然后,新的进程开始执行应用程序代码。

Zygote 的启动流程就是这样,它在 Android 系统中起到了非常重要的作用,保证了应用程序的快速启动和系统资源的有效利用。

Native Zygote启动和Java Zygote启动

Android系统中的Zygote启动过程可以被分为Native Zygote启动和Java Zygote启动两个阶段。

Native Zygote启动:

这部分主要涉及底层C/C++代码。在此阶段,会完成一些底层的系统设置和初始化工作。以下是Native Zygote启动阶段的一些主要任务:

  1. 创建Zygote进程:首先,Android系统的init进程会启动Zygote进程。

  2. 设置Zygote进程:对Zygote进程进行一系列底层的设置,包括设置进程的UID/GID、进程的capabilities等。

  3. 启动Dalvik/ART虚拟机:虚拟机是运行Java代码的环境,因此在这一步,Zygote进程会启动Dalvik/ART虚拟机。

  4. 启动Socket服务:为了接收创建新应用程序进程的请求,Zygote进程会启动一个Socket服务。

Java Zygote启动:

一旦Dalvik/ART虚拟机启动,Zygote进程就会进入Java Zygote启动阶段。在这个阶段,Zygote进程主要执行以下任务:

  1. 预加载Java类和资源:Zygote进程会预先加载Android系统中所有应用程序共享的Java类和资源。

  2. 创建系统Server进程:系统Server进程是Android系统中的一个关键进程,它负责管理各种系统级别的服务,例如窗口管理服务、活动管理服务等。Zygote进程在这一步会创建系统Server进程。

  3. 进入等待状态:完成上述任务后,Zygote进程会进入等待状态,等待接收来自系统的新的请求。当收到请求时,Zygote进程会通过fork操作创建新的应用程序进程。

这两个阶段的过程都是为了实现Zygote的主要功能,即高效地创建新的应用程序进程。通过预先加载共享的库和资源,以及通过复制已经初始化的运行时环境,Zygote确保了应用程序可以快速启动,而且对系统资源的占用也最小化。

Zygote启动SystemServer

  1. 预加载类和资源:Zygote进程在启动后,会预加载Android系统中所有应用程序共享的类和资源。这些类和资源包括Android运行时(Android Runtime)、标准Java类库、系统服务等。

  2. 启动SystemServer进程:在预加载完类和资源后,Zygote进程会通过fork操作创建一个新的进程,然后在这个新的进程中启动SystemServer。启动SystemServer的命令是startSystemServer。

  3. 加载SystemServer类:在新的进程中,Zygote会加载SystemServer类。这个类是SystemServer进程的入口点。

  4. 调用SystemServer的main方法:加载完SystemServer类后,Zygote会调用SystemServer的main方法。在这个方法中,SystemServer会初始化并启动各种系统服务。

  5. 初始化系统服务:在SystemServer的main方法中,会创建并初始化各种系统服务,例如窗口管理服务、活动管理服务等。这些服务在SystemServer进程中运行,并通过Binder提供给其他进程使用。

  6. 启动完成:在所有的系统服务都启动并初始化完成后,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可以更好地保护这些信息的安全,防止被其他进程截获或篡改。

总的来说,Zygote服务的设计和它的IPC通信机制选择都是为了提高Android系统的性能和稳定性,同时保护系统的安全。

相关推荐
Winston Wood5 分钟前
Perfetto学习大全
android·性能优化·perfetto
Dnelic-3 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen5 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年13 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿15 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神16 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛16 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法17 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter18 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快19 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android