本指南将从源代码角度分析 WindowManagerService (WMS) 的核心工作流程,并配合时序图进行说明。
1. WMS 的启动与初始化 (SystemServer)
WMS 是在 SystemServer 进程中启动的系统核心服务。
- 路径:
frameworks/base/services/java/com/android/server/SystemServer.java - 代码关键点:
1
2
3// 在 startOtherServices 方法中
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore, new PhoneWindowManager(), mActivityManagerService.getAppTransition());
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
2. 窗口添加流程 (WindowManager.addView)
这是应用进程请求 WMS 显示 UI 的核心路径。
2.1 时序图:addView 过程
1 | sequenceDiagram |
2.2 核心步骤解析
- WindowManagerGlobal: 应用进程内的单例,管理所有窗口的 View 和 ViewRootImpl。
- ViewRootImpl: 连接 WindowManager 和控制台的纽带,负责触发绘制和与 WMS 通信。
- Session: 每个应用进程在 WMS 中对应一个 Session 对象,用于跨进程通信。
- addWindow: WMS 内部方法,负责创建
WindowState并维护 Z-order 堆栈。
3. 布局与 Surface 分配 (Relayout)
窗口添加后,需要确定具体大小并获得绘图“画布”(Surface)。
3.1 时序图:Relayout 过程
1 | sequenceDiagram |
4. 关键类及其关系
| 类名 | 职责 |
|---|---|
IWindowSession |
App -> WMS 的单向通道,处理添加、删除、布局请求。 |
IWindow |
WMS -> App 的回调通道,处理窗口缩放、焦点变化等。 |
WindowState |
WMS 为每个窗口维护的“身份证”,包含位置、层级、可见性等。 |
WindowToken |
窗口的归类令牌,用于管理 Activity 或 Dialog 等一组窗口的生命周期。 |
DisplayContent |
对应一个物理屏幕,管理该屏幕下的所有窗口堆栈。 |
5. 总结
WMS 的核心逻辑在于 管理 与 协调:
- 管理: 维护窗口的大小、位置、层级(Z-Order)。
- 协调: 向上承接 View 系统(App),向下通过 SurfaceFlinger 申请显示资源,同时与 InputManagerService 协作分发触摸事件。