Android Framework 面试系列(二)system_server

381 阅读4分钟

system_server 是什么

在之前的文章 Android Framework 面试系列(一)ZygoteZygote 中,我们知道 system_server 进程是由 zygote 进程启动的。system_server 启动 Android 所需要的系统服务,几乎所有的系统服务都运行在 system_server 进程上,它是Android基本服务的提供者,是Android系统运行的最基本需求。

因此当 system_server 进程创建失败时,将会重启 zygote 进程。重启逻辑如下所示,这里需要注意,对于 Android 5.0 以上系统,有两个 zygote 进程,分别是 zygote、zygote64 两个进程。对于 system_server 的父进程,一般来说 64 位系统其父进程是 zygote64 进程,32位系统则是 zygote 进程。

  • 当 kill system_server 进程后,只重启 zygote64 和 system_server,不重启 zygote;
  • 当 kill zygote64 进程后,只重启 zygote64 和 system_server,也不重启 zygote;
  • 当 kill zygote 进程,则重启 zygote、zygote64 以及 system_server。

system_server 的流程

  1. 设置相关的系统属性,比如系统的语言环境等
  2. 对虚拟机进行相关设置,比如堆内存的大小等
  3. 创建主线程 Looper
  4. 创建两个 Context,一个用来做业务逻辑等处理,另一个用来做UI显示,在system_server也是会显示一些UI的 (比如关机对话框)
  5. 创建 SystemServiceManager,负责系统 Service 的管理
  6. 启动系统服务,系统服务大体分为三种:引导服务、核心服务和其他服务。在 system_server 中会依次启动引导服务、核心服务和其他服务。
  7. 进入Looper.loop的无限循环中,等待其他线程通过 handler 发送消息到主线再处理。

SystemServer 开启的服务如下图所示,图片来源深入研究源码:Android10.0系统启动流程(四):SystemServer

image.png

system_server 是如何启动系统服务的

在 Android 中所有的系统服务,都是 SystemService 抽象类的子类对象。所有系统服务内部都实现了 onStart() 这个抽象方法。

而系统服务的启动,都是通过调用 SystemServiceManger.startServeice()。其内部会通过获取到参数传递的Class对象,使用反射的方式,获取到该类的构造器,创建该类的实例对象,并把该service对象添加到一个ArrayList列表中进行维护,最终调用 service.onStart(),完成服务的开启。

系统服务怎么解决相互依赖的问题

在 Android 中,这些系统服务都是相互依赖的。为了解决启动时的依赖问题,Android 系统首先对系统服务进行分类,主要有三类,分别是引导服务、核心服务和其他服务。

然后在分类启动期间,会分发启动阶段,告诉每个service当前处于启动的哪个阶段了,service根据相应的阶段信号可以做一些自己的事情。每个阶段如下所示:

// 该阶段表示系统正在等待默认显示设备准备就绪
public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;

// 此阶段意味着锁屏相关设置已经准备好
public static final int PHASE_LOCK_SETTINGS_READY = 480;

// 该阶段标志着系统的核心服务已经启动并准备就绪
// 像 ActivityManagerService、PackageManagerService、WindowManagerService 等
public static final int PHASE_SYSTEM_SERVICES_READY = 500;

// 表明 ActivityManagerService 已经完全准备好
// ActivityManagerService 负责管理应用组件的生命周期、任务栈、进程调度等重要工作
public static final int PHASE_ACTIVITY_MANAGER_READY = 550;

// 表示系统已经准备好允许第三方应用程序开始启动
public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;

// 代表系统启动完成
public static final int PHASE_BOOT_COMPLETED = 1000;

系统服务运行在什么线程上?

系统服务所运行运行的线程是不确定的。有些系统服务会启动自己的线程来做工作,比如 PackageManagerService(PMS)、BatteryService;而有的系统服务是与别的系统服务是共享一个线程来做工作的。

为什么系统服务不都跑在binder线程里?

因为binder线程是共享的,存在资源抢占问题,会影响系统服务响应的实时性。

为什么系统服务不都跑在自己私有的工作线程里?

开辟的线程太多,系统负载高,同时会浪费资源在切换线程里。

跑在binder线程和跑在工作线程,如何取舍?

对于实时性不高、耗时不多的可以跑在binder线程里

参考