01 WindowManagerService添加View
我来分析应用进程的 WindowManager 如何调用到 WindowManagerService.addWindow() 的完整调用链,并绘制时序图。
应用进程 WindowManager 到 WindowManagerService.addWindow() 调用链分析
核心调用流程
sequenceDiagram
participant App as 应用进程
participant WMI as WindowManagerImpl
participant WMG as WindowManagerGlobal
participant VRI as ViewRootImpl
participant Session as Session
participant WMS as WindowManagerService
App->>WMI: 1. addView(view, params)
Note over WMI: applyTokens(params)
设置window token等
WMI->>WMG: 2. addView(view, params, display, parentWindow, userId)
WMG->>WMG: 3. 参数验证和准备
Note over WMG: 检查view不为null
检查params类型
设置硬件加速标志
WMG->>VRI: 4. new ViewRootImpl(context, display)
Note over VRI: 创建ViewRootImpl实例
WMG->>WMG: 5. 添加到全局数组
Note over WMG: mViews.add(view)
mRoots.add(root)
mParams.add(wparams)
WMG->>VRI: 6. root.setView(view, wparams, panelParentView, userId)
VRI->>VRI: 7. setView内部处理
Note over VRI: 设置mView, mAttrs
requestLayout()
创建InputChannel
VRI->>Session: 8. mWindowSession.addToDisplayAsUser(...)
Note over Session: 通过IWindowSession接口调用
Session->>WMS: 9. mService.addWindow(this, window, attrs, ...)
Note over WMS: 最终到达目标方法
WMS->>WMS: 10. addWindow内部逻辑
Note over WMS: 权限检查
创建WindowState
添加到WindowManager
详细代码调用链
1. 应用调用 WindowManagerImpl.addView()
1 | // WindowManagerImpl.java |
2. WindowManagerGlobal.addView() 处理
1 | // WindowManagerGlobal.java |
3. ViewRootImpl.setView() 核心处理
1 | // ViewRootImpl.java |
4. Session.addToDisplayAsUser() 代理
1 | // Session.java |
5. WindowManagerService.addWindow() 最终实现
1 | // WindowManagerService.java |
关键组件说明
WindowManagerGlobal:
- 全局单例,管理所有窗口
- 维护 mViews、mRoots、mParams 三个数组
- 负责创建 ViewRootImpl 实例
ViewRootImpl:
- 每个窗口的根视图容器
- 负责窗口的布局、绘制、输入事件处理
- 与 WindowManagerService 通信的桥梁
Session:
- WindowManagerService 为每个客户端进程创建的唯一会话
- 封装了客户端与 WMS 之间的通信
- 记录客户端进程信息(UID、PID等)
WindowState:
- WindowManagerService 中表示单个窗口的实体
- 包含窗口的所有状态信息
- 真正的窗口管理层对象
总结
完整调用链:应用 WindowManagerImpl → WindowManagerGlobal → ViewRootImpl → Session → WindowManagerService.addWindow()
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 BravestSnail's Blog!