外观
AMS、ATMS、WMS、PMS、IMS,分别管什么?
标准回答
可以把 Android 系统服务理解成一组各管一摊事情的管理员。AMS 主要协调应用进程和 Service、广播、Provider 等运行;ATMS 主要管理 Activity、任务与页面切换;WMS 主要管理窗口的位置、大小、层级、可见性和焦点。
PMS 在这里指 PackageManagerService,管理应用包、组件和安装相关信息。IMS 在这里指 InputManagerService,负责输入设备与事件分发的系统侧协调。DMS 管显示设备,SurfaceFlinger 把各窗口等图层的内容合成后送往显示。它们会互相配合,但职责不同。
例如点图标打开音乐应用:系统查询入口组件,ATMS 决定启动或复用哪个页面和任务;进程不在时,由 AMS 的进程管理链路配合 Zygote 创建。应用创建页面并接入窗口,WMS 管窗口状态,应用画出内容,SurfaceFlinger 处理合成。再点播放按钮时,输入系统先找到目标窗口,应用内部才继续分发到按钮。
记忆这些名字时,先分清“管理状态”和“实际执行”。ATMS 安排页面生命周期,应用进程执行 onCreate;WMS 管窗口,TextView 仍由应用绘制。现代 Android 已将大量 Activity 和任务管理职责放在 ATMS,不能照旧资料把所有页面逻辑都归给 AMS。
关键机制
- 进程与组件看 AMS;页面和任务看 ATMS;窗口看 WMS。
- 应用包看 PackageManagerService;输入看 IMS;显示设备看 DMS。
- 绘制内容由应用等生产者产生,SurfaceFlinger 负责图层合成与呈现链路。
通俗例子
页面打开了但点不动:可能是焦点或触摸目标错误、输入通道异常,也可能是应用主线程堵住。不能因为现象发生在屏幕上,就直接判断都是 WMS 或 SurfaceFlinger 的问题。
追问与回答
这些服务是不是每个都在一个独立进程?
不是。AMS、ATMS、WMS、PackageManagerService 等核心服务通常共同运行在 system_server 中,各自使用相应线程、锁和内部接口。SurfaceFlinger、servicemanager 等则通常是独立原生进程。服务名字不同,不代表进程一定不同,也不代表一次相互调用必然跨进程。
为什么普通应用开发也需要知道这些?
因为启动失败、页面跑错屏、窗口不显示、焦点异常和输入超时,都跨越了业务代码与系统服务。知道分工后就能选择证据:任务记录看 activity,窗口看 window,输入看 input,包和权限看 package,再沿真实调用链定位,避免只在应用日志里盲猜。
易混淆点
WMS 是 WindowManagerService,常被误写成 WSM。PMS 也可能指 PowerManagerService,IMS 在通信领域也有其他含义,交流时先说全称。
参考资料
内容来源
- Android 技术札记 · 原条目
framework-map