WMS 的运行并非孤立,它深度依赖于图形合成、输入分发和视图系统。理解这些支撑系统,是掌握 WMS 源码逻辑的基石。
1. SurfaceFlinger:WMS 的图形“甲方”
WMS 负责管理窗口的逻辑层级,而 SurfaceFlinger 负责将这些层级真实地合成并渲染到屏幕上。
| 核心考点 | 详细解析 | 学习目的 |
|---|---|---|
| 图形缓冲区 (BufferQueue) | Surface 内部维护的生产者-消费者模型队列。 | 理解应用绘制的数据是如何传递给 SurfaceFlinger 的。 |
| Layer (层) | SurfaceFlinger 内部对窗口的映射,每个窗口对应一个 Layer。 | 理解 WMS 的 WindowState 最终是如何映射为渲染层的。 |
| 合成原理 (Composition) | VSync 触发,将多个 Layer 按照 Z-Order 合并。 | 掌握 Android 60/120 fps 流畅度的物理基础。 |
2. Input 系统:事件分发的“中转站”
WMS 协助 InputManagerService (IMS) 将触摸事件分发到正确的窗口。
| 核心考点 | 详细解析 | 学习目的 |
|---|---|---|
| IMS 与 Socket 通信 | IMS 通过 InputChannel(基于 Unix Domain Socket)与应用通信。 |
理解为什么输入事件分发不使用 Binder。 |
| 窗口定位 | WMS 维护全局窗口位置,告知 IMS 哪个坐标对应哪个窗口。 | 理解点击屏幕后,系统如何“定位”到你的按钮。 |
| 事件分发链 | IMS -> WMS (定位) -> ViewRootImpl -> DecorView -> ViewGroup -> View。 | 建立完整的事件分发全景图。 |
3. View 系统:WMS 的“应用端代理”
应用端通过 View 系统与 WMS 建立联系。
| 核心考点 | 详细解析 | 学习目的 |
|---|---|---|
| ViewRootImpl | 整个 View 树的根节点,负责与 WMS 的 Session 进行 IPC 通信。 |
理解 WindowManager.addView 背后的第一站。 |
| DecorView | 窗口的根视图,包含状态栏和内容区。 | 明确 Activity 布局的物理边界。 |
| Measure/Layout 触发 | relayoutWindow 成功后,WMS 反向驱动应用端执行绘制。 |
理清“系统驱动”与“应用主动”的逻辑闭环。 |
4. 总结:三大系统与 WMS 的协作关系
- WMS + SurfaceFlinger:解决“在哪里画,画多大”的问题。
- WMS + Input 系统:解决“谁接收点击”的问题。
- WMS + View 系统:解决“具体画什么”的问题。
掌握了这三者的协作,就掌握了 Android 系统 UI 展示的核心脉络。