WindowManagerService (WMS) 是 Android 系统中负责窗口管理的核心服务。与 AMS 相比,WMS 与图形显示、输入系统及 View 系统的交互更为紧密。设计一套科学的 WMS 学习路线,建议遵循“从基础支撑到核心模型,再到显示原理”的原则。
第一阶段:支撑系统(底层依赖知识)
在深入 WMS 源码前,必须掌握 WMS 运行的基础设施。
| 模块 | 关键考点 | 学习目的 |
|---|---|---|
| SurfaceFlinger | 图形缓冲区、Layer、合成原理 | 理解 WMS 最终的渲染产物是如何被合成并显示的。 |
| Input 系统 | IMS、事件分发、InputChannel | 理解 WMS 如何协助将点击事件派发到正确的窗口。 |
| View 系统 | ViewRootImpl、DecorView、Measure/Layout | 理解应用端是如何通过 View 系统与 WMS 建立联系的。 |
第二阶段:核心模型(窗口的骨架)
WMS 服务端通过一组对象来维护窗口的层级、属性和状态。
| 核心类 | 职责描述 | 对应现实模型 |
|---|---|---|
| WindowToken | 标识一组窗口(如 Activity 下的所有 Window),用于权限和组织。 | 分组标签 |
| WindowState | 服务端对单个窗口的建模,存储大小、位置、可见性等信息。 | 窗口本体 |
| DisplayContent | 对应物理或虚拟屏幕,管理该屏幕下的所有窗口。 | 整个屏幕 |
| Session | 应用进程与 WMS 之间的 Binder 通道,每个进程一个。 | 通信信道 |
第三阶段:核心流程(窗口的诞生与消亡)
通过追踪一个 Activity 窗口从无到有的过程,理清 WMS 的运行逻辑。
| 学习步骤 | 核心关键点 | 关注重点 |
|---|---|---|
| 1. 窗口添加 (Add) | WindowManagerGlobal -> WMS.addWindow |
权限校验、WindowState 创建、Z-Order 分配。 |
| 2. 布局计算 (Relayout) | WMS.relayoutWindow |
窗口框架计算(Frame)、显示区域(Insets)的处理。 |
| 3. Surface 分配 | WindowSurfaceController |
理解 Surface 如何从 WMS 传递到应用进程。 |
| 4. 窗口移除 (Remove) | removeWindow |
状态同步、资源清理、窗口退出动画。 |
第四阶段:进阶专题(高级显示控制)
了解现代 Android 在复杂显示场景下的处理机制。
| 进阶专题 | 核心内容 | 学习意义 |
|---|---|---|
| 层级管理 (Z-Order) | BaseLayer、SubLayer 计算规则。 | 理解窗口遮挡关系与叠加顺序。 |
| 窗口动画 | WindowAnimationSpec、Remote Animation。 |
掌握 App 切换动画及系统动画的底层实现。 |
| 多窗口与分屏 | TaskStack 组织、多任务焦点管理。 | 适配大屏、折叠屏等现代设备。 |
| 输入法窗口 (IME) | IME 窗口的特殊层级与生命周期。 | 解决输入法遮挡及交互的疑难杂症。 |
💡 学习建议:
- 结合 Winscope 工具:利用 Android 提供的 Winscope 录制并查看窗口层级和 Surface 状态,将抽象代码可视化。
- 理解 Insets 机制:现代 Android 窗口管理很大一部分精力在于处理状态栏、导航栏、挖孔屏等带来的
WindowInsets。 - 分层阅读:WMS 源码逻辑分散在
services的核心包中,建议从WindowManagerService.java入手,先理清addWindow这一条主线。