Android Framework 之 SystemServer

Android SystemServer

SystemServer是Android系统中的一个核心组件,负责启动和管理许多重要的系统服务。它的启动过程相对复杂,包含以下主要步骤:

  1. Zygote启动SystemServer:在Android系统启动过程中,Zygote进程会通过fork操作创建一个新的进程,并在这个新的进程中启动SystemServer。

  2. 加载并执行SystemServer的main函数:SystemServer进程启动后,会加载SystemServer类并执行其main函数。这个函数是SystemServer的入口点,它负责启动和初始化各种系统服务。

  3. 创建Looper和Handler:SystemServer会创建一个Looper和一个Handler,它们用于在主线程中处理消息和运行任务。Looper是Android事件循环的一部分,负责在主线程中接收和分发消息。Handler则用于发送和处理消息。

  4. 启动各种系统服务:在SystemServer的main函数中,会创建并初始化各种系统服务。这些服务包括ActivityManagerService、PackageManagerService、WindowManagerService等。这些服务在SystemServer进程中运行,并通过Binder提供给其他进程使用。

  5. 创建系统上下文:SystemServer创建一个系统级别的Context,这个Context是许多系统服务运行的环境。

  6. 运行Looper循环:完成上述操作后,SystemServer会启动Looper的消息循环。这个循环会一直运行,处理来自各种系统服务的消息。

SystemServer的启动过程就是这样。它在Android系统中起到了非常重要的作用,管理和提供了许多关键的系统服务。这些服务对Android系统的运行至关重要,它们负责处理用户输入、管理应用程序、控制屏幕显示等等。

系统服务启动的相互依赖

Android 系统中的各种系统服务可能会有相互依赖关系,即某些服务可能依赖于其他服务才能正常工作。为了解决这个问题,Android 在 SystemServer 中使用了一种特殊的启动顺序和机制,下面简单介绍这个过程:

  1. 按照固定顺序启动服务:在 SystemServer 的启动过程中,系统服务是按照一个固定的顺序启动的。这个顺序是根据服务之间的依赖关系来确定的,确保某个服务在依赖的服务之后启动。

  2. 分阶段启动服务:系统服务的启动过程分为两个阶段。在第一阶段,所有的服务都会被创建和初始化,但不会启动。在第二阶段,所有的服务都会被启动。这样做的好处是,当一个服务在第二阶段启动时,它依赖的其他服务已经被创建和初始化了。

  3. 懒加载服务:为了解决服务之间的循环依赖问题,Android 提供了一种名为 “Service Fetcher” 的机制。这个机制允许一个服务在需要时才获取它依赖的其他服务,而不是在启动时就获取。这样,即使两个服务互相依赖,也可以正确地启动。

  4. 服务异常处理:如果一个服务在启动过程中发生异常,SystemServer 会捕获这个异常并终止进程。这样做的原因是,一个不能正常启动的系统服务可能会导致整个系统不稳定。

这就是 Android 如何解决系统服务启动的相互依赖问题的。虽然这个机制相对复杂,但是它可以确保所有的系统服务都能正确地启动,使得整个系统可以正常运行。

SystemServer创建并初始化各种系统服务

SystemServer创建并初始化各种系统服务的过程大致如下:

  1. 加载并执行SystemServer的main函数:SystemServer进程启动后,首先会加载SystemServer类并执行其main函数。这个函数是SystemServer的入口点。

  2. 创建并运行SystemServer的Looper:SystemServer会创建一个Looper对象并调用其loop()方法,以开始处理消息队列中的消息。Looper对象是Android中处理消息循环的核心组件。

  3. 创建各种系统服务:SystemServer在其主线程(也就是主Looper线程)中创建各种系统服务,这些服务包括(但不限于)ActivityManagerService、PackageManagerService、WindowManagerService等。创建这些服务通常涉及实例化相应的类并调用其初始化方法。

至于SystemServer如何监听这些服务是否启动成功,具体的方法可能因服务而异,但通常包括以下几种方式:

  1. 通过回调函数:某些服务可能会提供一个回调函数,当服务启动成功或失败时,这个回调函数会被调用。

  2. 通过异常处理:如果服务在启动过程中抛出了异常,SystemServer会捕获这个异常。根据异常的类型和信息,SystemServer可以判断服务是否启动成功。

  3. 通过检查服务的状态:SystemServer可以通过调用服务的方法来检查其状态。例如,SystemServer可能会调用服务的isRunning()方法来检查服务是否正在运行。

请注意,如果一个系统服务启动失败,SystemServer通常会选择终止整个进程,因为一个不能正常工作的系统服务可能会导致整个系统的不稳定。在实际的开发过程中,开发者应该尽量确保系统服务能够正确地启动并运行。

混淆的 SystemServer 、ServiceManager 、SystemServerManager

ServiceManager 和 SystemServerManager

在 Android 系统中,ServiceManager 和 SystemServiceManager 是两个不同的概念,它们的职责和功能不同:

  1. ServiceManager:ServiceManager 是 Android 的一个核心组件,它提供了一个全局的服务注册表,用于存储所有已注册的系统服务。ServiceManager 主要用于 IPC(进程间通信),通过它,应用和系统服务可以互相通信。它提供了 addService() 方法来注册服务,以及 getService() 和 checkService() 方法来获取服务。ServiceManager 是系统服务中的一个基础组件,用于管理和调度所有的系统服务。

  2. SystemServiceManager:SystemServiceManager 是一个在 SystemServer 中负责启动和管理系统服务的类。它并不涉及到 IPC,而是用来在 SystemServer 进程中启动和管理各种系统服务。SystemServiceManager 提供了一组 API,用于启动服务、获取服务以及查询服务的状态等。

总的来说,ServiceManager 是用于 IPC 和系统服务管理的基础组件,而 SystemServiceManager 是在 SystemServer 进程中用来启动和管理服务的工具类。

SystemServer 和 SystemServerManager

SystemServiceManager 在 Android 系统中并不是一个独立的服务,而是一个负责管理系统服务(system services)的类。它主要是用来启动和管理 SystemServer 中的各种系统服务。

SystemServer 是一个进程,它在系统启动时创建并初始化各种系统服务。这些服务是 Android 系统的核心组件,包括 WindowManager、ActivityManager、PackageManager 等。SystemServiceManager 是在这个进程中被用来具体执行服务启动、管理等任务的工具类。

SystemServer 启动时,它会创建一个 SystemServiceManager 的实例,并用它来启动和管理各种系统服务。SystemServiceManager 提供了一组 API,用于启动服务,获取服务,以及查询服务状态等。

总的来说,**SystemServiceManager **不是一个服务,而是 SystemServer 使用的一个工具,用于管理系统服务的生命周期。

在 SystemServiceManager 类中,Android 提供了一组 API 来启动、获取和查询系统服务的状态。以下是这些方法的基本使用方法:

  1. 启动服务(startService):SystemServiceManager 提供了 startService() 方法来启动一个新的系统服务。此方法需要一个 Service 类型的参数,它是要启动的服务的实例。这个方法会调用服务的 onCreate() 方法来创建服务,然后调用服务的 onStartCommand() 方法来启动服务。

  2. 获取服务(getService):要获取一个已启动的服务,可以使用 SystemServiceManager 的 getService() 方法。这个方法需要一个 String 类型的参数,它是要获取的服务的名字。getService() 方法会返回一个 IBinder 对象,你可以用这个对象来和服务进行通信。

  3. 查询服务状态(isServiceRunning):SystemServiceManager 提供了 isServiceRunning() 方法来查询一个服务是否正在运行。这个方法需要一个 Class 类型的参数,它是要查询的服务的类。isServiceRunning() 方法会返回一个布尔值,如果服务正在运行,它会返回 true,否则返回 false。

要注意的是,以上方法通常在 SystemServer 进程中使用,而不是在普通的 Android 应用中使用。在 Android 应用中,你通常会使用 Context 类的 startService()、stopService()、bindService() 和 unbindService() 方法来启动、停止和绑定服务。

ServiceManager 和 SystemServer

在 Android 系统中,ServiceManager 和 SystemServer 是两个非常关键但功能不同的组件:

ServiceManager:ServiceManager 是 Android 的一个核心组件,用于管理系统中所有的服务。它提供了一个全局的服务注册表,用于存储所有已注册的系统服务。其他组件(包括应用)可以通过 ServiceManager 获取到已注册的服务,进行跨进程通信(IPC)。ServiceManager 主要提供了 addService() 方法用于服务注册,以及 getService() 和 checkService() 方法用于获取服务。

SystemServer:SystemServer 是 Android 系统的一个核心进程,负责启动和管理许多重要的系统级服务,如 WindowManagerService(窗口管理服务)、ActivityManagerService(活动管理服务)等。在 Android 启动流程中,SystemServer 是由 Zygote 进程孵化(fork)出来的。SystemServer 在启动过程中会创建各种系统服务,并将这些服务注册到 ServiceManager 中供其他组件调用。

简单来说,SystemServer 是一个进程,负责启动和管理系统服务;而 ServiceManager 是 Android 的核心组件,提供了全局的服务注册表,用于管理和调度所有的系统服务。

总结

SystemServer 进程在启动过程中,会启动 ServiceManager 这个组件。

SystemServer 进程启动的过程中,会启动各种系统服务。这些系统服务的启动是通过 SystemServiceManager 类的 startService 方法实现的。

这些系统服务启动后,它们会通过 addService 方法向 ServiceManager 注册。addService 方法是 ServiceManager 的方法,允许系统服务将自己注册到 ServiceManager 的服务列表中。

当应用程序需要使用某个系统服务时,应用程序会通过 ServiceManagergetService 方法获取到该服务的 **Binder **对象,然后通过这个 Binder 对象与对应的系统服务进行跨进程通信。

这里需要注意的是,ServiceManagerSystemServiceManager 是两个不同的组件。ServiceManager 负责系统服务的注册和查找,是一个 IPC 机制的核心组件。而 SystemServiceManagerSystemServer 内部的一个类,主要负责系统服务的启动和生命周期管理。

你可能感兴趣的:(android)