WMS 专项 - 窗口添加流程解析 (AddWindow)

当应用端调用 WindowManager.addView 时,窗口的添加流程正式开启。这是一个跨越应用进程与 WMS 服务端的重要 IPC 过程。

1. 应用端:ViewRootImpl 的建立

WindowManagerGlobal 中,每添加一个窗口都会创建一个对应的 ViewRootImpl。它负责:

  • 触发第一次 requestLayout
  • 通过 mWindowSession.addToDisplay 向 WMS 发起跨进程调用。

2. 服务端:WMS.addWindow 核心逻辑

关键步骤 内部行为 目的
1. 权限与令牌校验 检查 WindowToken 是否合法。 确保如子窗口、Activity 窗口拥有正确的宿主权限。
2. 创建 WindowState 在 WMS 内部为该窗口建立“档案”。 存储窗口的所有几何属性、标志位及父子关系。
3. Z-Order 计算 根据 WindowType 分配显示层级。 决定窗口在垂直方向上谁盖住谁。
4. 关联 Session 将窗口与发起进程的 Session 绑定。 便于后续的 IPC 通信与异常清理。

3. 核心对象关系图

App 进程 (ViewRootImpl) <— IWindowSession (Binder) —> SystemServer (WMS)

  • WMS 持有 WindowToken (管理组)
  • WindowToken 包含多个 WindowState (管理个体)
, ,