目录
一、什么是WMS?
WindowManagerService(WMS) 是 Android 系统中负责管理窗口的核心服务,其职责包括窗口的创建、层级排序、布局、动画、输入事件分发以及与 SurfaceFlinger 协同完成图形合成。WMS 是 Android GUI 系统的中枢,直接影响应用的显示、交互和多任务处理。主要功能包括:
窗口生命周期管理:处理窗口的添加、删除、层级调整(Z-Order)。
布局与绘制:通过
performLayoutAndPlaceSurfacesLocked
计算窗口位置,触发Surface
更新。输入事件分发:与
InputManagerService
协同,将触摸事件路由到焦点窗口。动画处理:窗口切换、过渡动画的管理(如
WindowAnimator
)。多窗口模式:支持分屏、画中画、自由窗口等模式。
显示管理:与
DisplayManagerService
协作处理多屏显示。
二、WMS 的架构层次
1. 主要分层与工作流程
1.1 客户端层
通过Binder IPC机制向WMS服务发起窗口操作请求,处理用户交互事件的分发。包括 Window
、ViewRootImpl
和应用进程,负责发起窗口操作请求(如添加/删除窗口)。其工作流程如下
窗口创建:应用通过
WindowManager.addView()
创建新窗口,ViewRootImpl建立与WMS的通信链路。布局测量:完成Measure/Layout阶段后,通过
relayoutWindow()
向WMS提交窗口属性变更。输入事件路由:ViewRootImpl通过InputChannel接收WMS派发的触摸事件。
// Android窗口创建示例代码 WindowManager wm = getSystemService(WindowManager.class); View decorView = new MyDecorView(context); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, TYPE_APPLICATION, FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); wm.addView(decorView, params); // 触发WMS窗口添加流程:ml-citation{ref="5,6" data="citationList"}
1.2 服务层
WMS 服务运行在 system_server
进程,管理所有窗口状态和策略。维护窗口堆栈状态,执行窗口策略决策,协调Surface分配。主要工作流程如下:
窗口策略验证:检查窗口类型、权限、Z-order等合规性。
布局计算:根据窗口属性计算最终显示区域。
Surface分配:通过
SurfaceControl
创建图形缓冲区。// WMS窗口添加伪代码(简化版) class WindowManagerService { void addWindow(Session session, IWindow client, WindowManager.LayoutParams attrs) { // 1. 权限校验 checkCallingPermission(attrs.type); // 2. 创建窗口状态对象 WindowState win = new WindowState(session, client, attrs); // 3. 更新窗口层级 mWindowMap.put(client.asBinder(), win); mRoot.computeWindowLayers(true); // 计算Z-order:ml-citation{ref="3,8" data="citationList"} // 4. 分配Surface win.createSurfaceControl(); } }