7、SystemServer核心服务:AMS、WMS、PMS等核心服务启动流程与职责
SystemServer,这个名字你肯定不陌生。它是Android系统的“大管家”,几乎所有你叫得上名字的核心服务——ActivityManagerService、WindowManagerService、PackageManagerService——都在这里启动。说白了,SystemServer就是整个Android框架的发动机。
我个人习惯把SystemServer的启动过程看作一场精心编排的交响乐。每个服务都有自己登场的时机,早了不行,晚了系统就卡住。今天我们就来拆解一下,这几个核心服务到底是怎么启动的,它们又各自扛着什么职责。
7.1 SystemServer的启动入口
SystemServer本身是一个Java进程,由Zygote孵化而来。入口在SystemServer.main()方法里。嗯,这里要注意,它并不是一股脑把所有服务都new出来,而是分阶段进行的。
// 伪代码示意
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
// 1. 准备主线程Looper
Looper.prepareMainLooper();
// 2. 加载本地库
System.loadLibrary("android_servers");
// 3. 创建系统上下文
createSystemContext();
// 4. 分阶段启动服务
startBootstrapServices(); // 引导服务
startCoreServices(); // 核心服务
startOtherServices(); // 其他服务
// 5. 进入消息循环
Looper.loop();
}
你看,它分成了三个启动阶段。为什么这么分?因为服务之间有依赖关系。比如WMS需要用到PMS提供的包信息,AMS又需要WMS来管理窗口焦点。所以必须按依赖链来排顺序。
7.2 AMS:ActivityManagerService
AMS是Android系统中最重要的服务之一,没有它,你的App连启动都做不到。它负责管理四大组件的生命周期、进程调度、任务栈管理、权限检查等等。
7.2.1 AMS的启动流程
AMS在startBootstrapServices()阶段启动。为什么这么早?因为后续很多服务都需要AMS来管理进程。
// SystemServer.java
private void startBootstrapServices() {
// 安装系统服务
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class);
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
// 设置系统进程
mActivityManagerService.setSystemProcess();
}
AMS启动后,会做几件重要的事:
- 创建
ProcessRecord来管理系统进程 - 初始化
IntentResolver用于解析Intent - 注册系统广播接收器
- 启动
Watchdog监控系统健康
7.2.2 AMS的核心职责
| 职责 | 说明 |
|---|---|
| 组件管理 | 管理Activity、Service、BroadcastReceiver、ContentProvider的生命周期 |
| 进程管理 | 维护进程优先级,决定何时杀进程回收内存 |
| 任务栈管理 | 管理Activity的返回栈、启动模式(standard、singleTop等) |
| 权限检查 | 检查App是否有权限执行某些操作 |
7.3 WMS:WindowManagerService
WMS负责管理窗口。你看到的每一个界面元素——状态栏、导航栏、App的Activity窗口——都由WMS统一调度。它决定了哪个窗口在最上面,哪个窗口该获得焦点。
7.3.1 WMS的启动流程
WMS在startCoreServices()阶段启动。为什么比AMS晚?因为WMS需要AMS已经就绪,才能处理窗口焦点和输入事件的分发。
// SystemServer.java
private void startCoreServices() {
// 启动WMS
wm = WindowManagerService.main(context, inputManager,
mActivityManagerService.mWindowManager,
mActivityManagerService.mDisplayManager,
mActivityManagerService.mPolicy);
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
}
WMS启动时,会做这些事:
- 创建
WindowManagerPolicy,用于处理窗口策略(比如锁屏、横竖屏切换) - 初始化
DisplayContent,管理多屏显示 - 启动
InputManager,开始监听输入事件
7.3.2 WMS的核心职责
| 职责 | 说明 |
|---|---|
| 窗口管理 | 管理窗口的添加、移除、大小、位置、层级 |
| 输入事件分发 | 将触摸、按键事件分发给正确的窗口 |
| 动画管理 | 管理窗口切换动画、启动动画 |
| 屏幕旋转 | 处理横竖屏切换时的窗口布局调整 |
7.4 PMS:PackageManagerService
PMS负责管理所有已安装的APK。它维护着包名、权限、组件信息、签名等数据。你安装一个App时,PMS会解析APK,提取出AndroidManifest.xml中的信息,然后存到数据库中。
7.4.1 PMS的启动流程
PMS也在startCoreServices()阶段启动。它启动时要做的事情非常多,因为需要扫描所有已安装的APK。
// SystemServer.java
private void startCoreServices() {
// 启动PMS
PackageManagerService pms = new PackageManagerService(context,
mActivityManagerService.mPackageManager,
mActivityManagerService.mInstaller);
ServiceManager.addService("package", pms);
}
PMS的构造函数里,会做这些事:
- 扫描
/system/app、/data/app等目录下的APK - 解析每个APK的AndroidManifest.xml
- 建立包名到组件信息的映射
- 检查签名一致性
- 更新权限数据库
7.4.2 PMS的核心职责
| 职责 | 说明 |
|---|---|
| 包管理 | 安装、卸载、更新APK |
| 组件解析 | 根据Intent查找匹配的Activity、Service等组件 |
| 权限管理 | 管理App的权限声明和授予 |
| 签名验证 | 验证APK签名的合法性,防止恶意篡改 |
7.5 核心服务之间的协作关系
这三个服务不是孤立的。它们之间有很多交互。举个例子:
- 用户点击桌面图标 → Launcher通过AMS启动Activity
- AMS查询PMS,找到对应的Activity信息
- AMS通知WMS创建窗口
- WMS分配窗口层级,显示到屏幕上
你看,一个简单的点击操作,背后是三个核心服务的协同工作。
7.6 核心服务启动流程图
下面这张图展示了SystemServer启动过程中,AMS、WMS、PMS的启动顺序和依赖关系。
7.7 总结
SystemServer的核心服务启动,说白了就是一场依赖链的编排。AMS最先登场,因为它要管进程和组件;WMS和PMS紧随其后,一个管窗口,一个管包信息。这三个服务一旦就绪,Android系统的基本骨架就搭起来了。
我在实际项目中遇到过一个问题:某次系统升级后,第三方App启动时总是闪退。排查了半天,发现是PMS在扫描APK时,因为签名缓存没更新,导致AMS拿到的组件信息是旧的。你看,一个缓存问题就能引发连锁反应。
所以,理解这些核心服务的启动流程和职责,不仅仅是应付面试。它能在你遇到系统级Bug时,帮你快速定位问题根源。嗯,这就是我今天想分享的内容。