1. 引言
在 Android 系统中,ActivityManagerService (AMS) 、WindowManagerService (WMS) 和 PackageManagerService (PMS) 是三个最核心的系统服务,它们分别管理着应用的生命周期、窗口显示和应用包管理。
但你是否知道,这些服务并不是独立进程,而是运行在同一个系统进程------system_server
中?本文将介绍 AMS/WMS/PMS 的核心作用,并深入探讨 system_server
进程的架构,包括它的线程模型和关键组件。
2. AMS、WMS、PMS 的作用
(1)ActivityManagerService (AMS) ------ 应用生命周期管理者
AMS 是 Android 的"大管家",负责:
- 启动/管理 Activity (如
startActivity()
的底层实现) - 管理应用进程 (通过
ProcessList
分配进程优先级) - 处理 ANR(Application Not Responding)
- 管理任务栈(TaskStack)(决定 Activity 如何回退)
举例:当你点击一个 App 图标时,AMS 会检查目标 Activity 是否存在,并决定是否创建新进程或复用已有进程。
(2)WindowManagerService (WMS) ------ 窗口管理者
WMS 负责所有 UI 窗口的显示与交互:
- 管理窗口层级(Window层级,如 Dialog、Toast、StatusBar)
- 处理触摸事件分发(决定哪个窗口接收事件)
- 与 SurfaceFlinger 协作(控制 Surface 的合成与渲染)
举例:当你滑动屏幕时,WMS 会计算触摸事件应该分发给哪个 App 的哪个窗口。
(3)PackageManagerService (PMS) ------ 包管理专家
PMS 管理所有 APK 的安装、卸载和权限:
- 解析 AndroidManifest.xml(获取四大组件信息)
- 管理应用权限 (如运行时权限
checkSelfPermission()
) - 处理 APK 安装/卸载 (调用
installd
守护进程)
举例 :当你安装一个 App 时,PMS 会校验签名、分配 UID,并更新 /data/system/packages.xml
。
3. system_server 进程:Android 系统服务的"大本营"
AMS、WMS、PMS 并不是独立进程,而是运行在 system_server
进程中的不同线程。
(1)system_server 是什么?
- 由 Zygote 进程孵化(Android 所有进程的父进程)。
- 在系统启动时初始化,运行几乎所有核心系统服务。
- 通过 Binder IPC 向 App 进程提供跨进程调用(如
IActivityManager
)。
(2)AMS/WMS/PMS 是 system_server 的线程吗?
是的!system_server
是一个多线程进程,不同的服务运行在不同的线程中:
- AMS →
ActivityManager
线程 - WMS →
WindowManager
线程 - PMS →
PackageManager
线程
它们通过 Binder 线程池 (如 Binder:XXX_1
)与 App 进程通信。
(3)system_server 还有哪些关键线程?
除了 AMS/WMS/PMS,system_server
还包含许多重要线程:
线程名 | 作用 |
---|---|
main | SystemServer 主线程,负责启动其他服务 |
android.fg | 处理前台任务(如广播、ANR 监测) |
android.ui | 处理 UI 相关任务(如 Input 事件) |
android.io | 管理 I/O 操作(如文件读写) |
Binder:XXX_N | Binder 线程池,处理跨进程调用 |
示例 :当 App 调用 startActivity()
时:
- App 进程通过 Binder 调用
system_server
的ActivityManager
线程。 - AMS 处理请求后,可能再通过 WMS 的
WindowManager
线程管理窗口。
4. 为什么这样设计?------ 多线程 vs 多进程
你可能会有疑问:为什么不把 AMS、WMS、PMS 拆分成独立进程?
(1)性能考量
- 减少进程间通信(IPC)开销:如果 AMS/WMS/PMS 是独立进程,每次调用都需要 Binder 通信,而 Binder 是同步阻塞的,频繁 IPC 会降低性能。
- 共享内存优化 :同进程内数据共享更快(如
ActivityRecord
、WindowState
等数据结构)。
(2)稳定性与依赖管理
- AMS/WMS/PMS 之间需要紧密协作(如启动 Activity 需要 AMS 和 WMS 配合)。
- 如果某个服务崩溃,整个
system_server
会重启(而不是单个服务崩溃导致系统不稳定)。
(3)历史演进
- 早期 Android 确实尝试过让部分服务独立(如
SurfaceFlinger
),但后来发现 IPC 开销太大,最终大多数核心服务合并到system_server
。
5. 如何观察 system_server 的线程?
我们可以通过以下命令查看 system_server
的线程情况:
sh
# 查看 system_server 进程ID
adb shell ps -A | grep system_server
# 查看该进程的所有线程
adb shell ps -T <PID>
# 或者用 top 看 CPU 占用
adb shell top -H -p <PID>
典型输出示例:
USER PID PPID TID CMD
system 1234 1 1234 system_server
system 1234 1 1235 Binder:1234_1
system 1234 1 1236 ActivityManager
system 1234 1 1237 WindowManager
system 1234 1 1238 PackageManager
6. 总结
- AMS/WMS/PMS 是 Android 最核心的三大系统服务,分别管理应用、窗口和包。
- 它们运行在
system_server
进程的不同线程,而非独立进程,以减少 IPC 开销。 system_server
是一个多线程进程,包含主线程、Binder 线程、AMS/WMS/PMS 专属线程等。- 这样设计的优势:性能高、协作方便、稳定性强。
如果你是 Android 开发者,理解 system_server
的架构,能帮助你更深入地掌握 Framework 层的工作原理,尤其是在分析 ANR、UI 卡顿、Binder 通信等问题时。
7. 扩展思考
- 如果 AMS 的线程卡死,会影响 WMS 吗?(答案:会,因为它们同属
system_server
进程!) - 为什么
SurfaceFlinger
不在system_server
里?(答案:因为它需要独立的 GPU 访问权限,且历史原因。) - 如何优化
system_server
的负载?(答案:减少跨进程调用、避免主线程阻塞。)