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 的流程
- 设置相关的系统属性,比如系统的语言环境等
- 对虚拟机进行相关设置,比如堆内存的大小等
- 创建主线程 Looper
- 创建两个 Context,一个用来做业务逻辑等处理,另一个用来做UI显示,在system_server也是会显示一些UI的 (比如关机对话框)
- 创建 SystemServiceManager,负责系统 Service 的管理
- 启动系统服务,系统服务大体分为三种:引导服务、核心服务和其他服务。在 system_server 中会依次启动引导服务、核心服务和其他服务。
- 进入Looper.loop的无限循环中,等待其他线程通过 handler 发送消息到主线再处理。
SystemServer 开启的服务如下图所示,图片来源深入研究源码:Android10.0系统启动流程(四):SystemServer
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线程里
参考
- 深入研究源码:Android10.0系统启动流程(四):SystemServer
- Android大脑--systemserver进程
- Android-ReadTheFuckingSourceCode/article/android/framework/04_system_server_02.md at master · jeanboydev/Android-ReadTheFuckingSourceCode · GitHub
- 【FrameWork】①系统服务及应用进程相关_framework core应用进程 service 进程-CSDN博客
- blog.csdn.net/HUandroid/a…