Android Framework 之 Zygote

这篇具有很好参考价值的文章主要介绍了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系统的性能和稳定性,同时保护系统的安全。文章来源地址https://www.toymoban.com/news/detail-622292.html

到了这里,关于Android Framework 之 Zygote的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android】Android Framework系列---CarPower电源管理

    智能座舱通常包括中控系统、仪表系统、IVI系统 、后排娱乐、HUD、车联网等。这些系统需要由汽车电源进行供电。由于汽车自身的特殊供电环境(相比手机方便的充电环境,汽车的蓄电池如果没有电是需要专业人士操作的),其电源状态会比较复杂,既要满足车内的座舱系统

    2024年02月07日
    浏览(35)
  • 【Android】Android Framework系列---CarPower深度睡眠STR

    之前博客说了CarPower的开机启动流程 这里分析一下,Android CarPower实现深度睡眠的流程。 首先, 什么是深度睡眠(Deep Sleep) ? Android进入Deep Sleep后, 关闭屏幕、关闭CPU的电源,保持RAM的电源(激活状态) 。深度睡眠会进行 Suspend-to-RAM 挂起到内存( 做车载的经常会听到的STR )。

    2024年02月05日
    浏览(31)
  • Android Framework层开发

    查看源码工具: SourceInsight Instrumentation :可以理解为ActivityThread的一个工具类,在ActivityThread中初始化,一个进程只存在一个Instrumentation对象,在每个Activity初始化时,会通过Activity的Attach方法,将该引用传递给Activity。Activity所有生命周期的方法都有该类来执行。 Init进程(pi

    2024年02月04日
    浏览(29)
  • 【Android Framework (八) 】- Service

    1,挂载文件系统,创建文件目录 调用selinux_setup权限安全相关 2,初始化内存空间 初始化属性服务 创建Epoll 注册监听子进程重启异常操作等,对子进程进行线程守护 3,startPropertyServic 开启属性服务 进行监听 4,LoadBootScripts 加载init.rc文件 进行解析 调用do_class_start 文件开启

    2024年02月01日
    浏览(26)
  • Android Framework 之 ServiceManager

    ServiceManager 在 Android 系统中扮演了核心的角色。主要负责跨进程通信(IPC)的管理和服务的注册与查找。 管理系统服务 : ServiceManager 提供一个全局的服务注册表,用于存储所有的系统服务。一个服务一旦被注册到 ServiceManager,其他的进程就可以通过 **ServiceManager **来访问这

    2024年02月14日
    浏览(30)
  • Android Framework基础面试篇~

    在Android应用开发面试中,针对Framework的问题是常被考察的。以下是一些常见的Framework金典面试题目及其详解: 1. 什么是Android应用生命周期?你能描述一下它包含哪几个阶段吗? Android应用生命周期指的是应用从启动到关闭的整个过程。 它包括以下四个阶段: onCreate(创建)

    2024年02月10日
    浏览(35)
  • Android Framework基础知识

    哈喽大家好,我是Zzz. 给大家分享一篇Framework入门的基础知识文章,内容纯纯原创。 一、Application,Activity和进程的关系?     Application、Activity只是进程虚拟机运行的一个类对象,只是属于系统的一个组件和进程没有直接联系。Android支持为每个组件可以单独进程方式运行。

    2024年03月24日
    浏览(29)
  • Android Framework 之 SystemServer

    SystemServer是Android系统中的一个核心组件,负责启动和管理许多重要的系统服务。它的启动过程相对复杂,包含以下主要步骤: Zygote启动SystemServer :在Android系统启动过程中,Zygote进程会通过fork操作创建一个新的进程,并在这个新的进程中启动SystemServer。 加载并执行SystemSer

    2024年02月14日
    浏览(28)
  • Android Framework 之 启动流程

    Android 系统的启动流程 Android 系统的启动流程可以分为以下几个主要步骤: 引导加载器(Bootloader)启动 :当你打开一个 Android 设备时,首先启动的是引导加载器。引导加载器负责启动 Android 的核心操作系统。 Linux 内核启动 :引导加载器加载并启动 Linux 内核。Linux 内核负责

    2024年02月14日
    浏览(27)
  • Android Framework | AOSP源码下载及编译指南(基于Android13)

    AOSP(Android Open Source Project)是Android操作系统的开源项目,通过下载和编译AOSP源码,您可以获得原始的Android系统,并进行定制和开发。本教程将向您介绍如何下载AOSP源码并进行编译的步骤。 如何只是浏览查看AOSP源码,则没必要下载源码,可以使用google提供的Code Search工具进

    2024年01月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包