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系统的性能和稳定性,同时保护系统的安全。

相关推荐
雨白4 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹6 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空7 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭8 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日9 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安9 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑9 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟13 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡14 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi0014 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体