WMS 源代码流程分析

本指南将从源代码角度分析 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sequenceDiagram
participant App as 应用进程 (Activity/View)
participant WMGlobal as WindowManagerGlobal
participant VRI as ViewRootImpl
participant Session as Session (WMS Proxy)
participant WMS as WindowManagerService

App->>WMGlobal: addView(view, params)
WMGlobal->>VRI: new ViewRootImpl()
VRI->>VRI: setView()
VRI->>Session: addToDisplay()
Session->>WMS: addWindow()
WMS->>WMS: 验证权限 & Token
WMS->>WMS: 创建 WindowState 实例
WMS-->>VRI: 返回操作结果 (OK/Err)

2.2 核心步骤解析

  1. WindowManagerGlobal: 应用进程内的单例,管理所有窗口的 View 和 ViewRootImpl。
  2. ViewRootImpl: 连接 WindowManager 和控制台的纽带,负责触发绘制和与 WMS 通信。
  3. Session: 每个应用进程在 WMS 中对应一个 Session 对象,用于跨进程通信。
  4. addWindow: WMS 内部方法,负责创建 WindowState 并维护 Z-order 堆栈。

3. 布局与 Surface 分配 (Relayout)

窗口添加后,需要确定具体大小并获得绘图“画布”(Surface)。

3.1 时序图:Relayout 过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sequenceDiagram
participant VRI as ViewRootImpl
participant Session as Session (WMS Proxy)
participant WMS as WindowManagerService
participant WinState as WindowState
participant SF as SurfaceFlinger

VRI->>VRI: performTraversals()
VRI->>Session: relayout()
Session->>WMS: relayoutWindow()
WMS->>WinState: createSurfaceControl()
WinState->>SF: 请求分配 Layer
SF-->>WinState: 返回 SurfaceControl Native 句柄
WMS-->>VRI: 填充应用端的 Surface 对象
VRI->>VRI: 开始应用层绘制 (Canvas/OpenGL)

4. 关键类及其关系

类名 职责
IWindowSession App -> WMS 的单向通道,处理添加、删除、布局请求。
IWindow WMS -> App 的回调通道,处理窗口缩放、焦点变化等。
WindowState WMS 为每个窗口维护的“身份证”,包含位置、层级、可见性等。
WindowToken 窗口的归类令牌,用于管理 Activity 或 Dialog 等一组窗口的生命周期。
DisplayContent 对应一个物理屏幕,管理该屏幕下的所有窗口堆栈。

5. 总结

WMS 的核心逻辑在于 管理协调

  • 管理: 维护窗口的大小、位置、层级(Z-Order)。
  • 协调: 向上承接 View 系统(App),向下通过 SurfaceFlinger 申请显示资源,同时与 InputManagerService 协作分发触摸事件。

, ,