
一、WMS 是什么WMSWindowManagerService 是 Android 系统中负责窗口管理的核心服务运行在 system_server 进程中。它不直接绘制 UI而是管理窗口的层级、大小、位置、焦点和动画真正的渲染由SurfaceFlinger完成。二、核心定位三、核心职责职责说明窗口注册addWindow()创建WindowState注册到全局窗口树尺寸计算relayoutWindow()计算窗口实际大小、位置、InsetsSurface 创建通过SurfaceFlinger创建SurfaceControl返回给应用绘制Z-Order 管理按窗口类型分配 Layer决定窗口前后遮挡关系焦点管理维护当前焦点窗口驱动输入法显示/隐藏输入事件分发提供窗口信息给InputDispatcher决定触摸事件落到哪个窗口动画驱动WindowAnimator通过Choreographer同步 VSync 驱动窗口动画多屏管理DisplayContent管理每个物理屏幕的窗口树四、核心类关系类作用WindowState每个窗口在 WMS 中的状态对象与窗口 1:1 对应WindowToken窗口令牌将同一组件如 Activity的窗口归组管理DisplayContent代表一个物理屏幕管理该屏幕上的窗口树RootWindowContainer所有DisplayContent的根容器全局窗口树WindowAnimator驱动窗口动画通过Choreographer监听 VSyncWindowSurfacePlacer计算窗口大小、位置执行performSurfacePlacement()PhoneWindowManager窗口策略实现定义窗口类型到 Layer 的映射规则五、窗口显示三大流程1. addWindow — 窗口注册2. relayoutWindow — Surface 创建与尺寸计算3. finishDrawing — 通知显示六、Z-Order窗口层级手机屏幕扩展为三维空间Z 轴垂直屏幕指向用户。WMS 通过窗口类型 → Layer 映射决定层级窗口类型Layer 值说明TYPE_SYSTEM_OVERLAY3000系统覆盖层紧急警报TYPE_SYSTEM_ERROR2010系统错误对话框TYPE_STATUS_BAR2000状态栏TYPE_NAVIGATION_BAR2019导航栏TYPE_APPLICATION_OVERLAY2038应用悬浮窗需权限TYPE_APPLICATION2普通应用窗口TYPE_BASE_APPLICATION1Activity 基础窗口TYPE_WALLPAPER2013壁纸Layer 计算// PhoneWindowManager.javawin.mBaseLayermPolicy.getWindowLayerFromTypeLw(win.getBaseType());win.mSubLayermPolicy.getSubWindowLayerFromTypeLw(attrs.type);同 Layer 窗口按添加顺序排列后添加的在上方。七、输入事件分发八、WMS 启动流程三线程协作为什么需要三线程android.display高优先级处理显示相关操作低延迟android.ui处理 UI 策略初始化system_server主线程协调其他服务九、关键源码WMS.addWindow()publicintaddWindow(Sessionsession,IWindowclient,intseq,LayoutParamsattrs,intviewVisibility,intdisplayId,...){// 1. 权限检查intresmPolicy.checkAddPermission(attrs,appOp);if(res!ADD_OKAY)returnres;// 2. 获取或创建 WindowTokenWindowTokentokendisplayContent.getWindowToken(attrs.token);if(tokennull){tokennewWindowToken(this,attrs.token,type,...);}// 3. 创建 WindowStateWindowStatewinnewWindowState(this,session,client,token,parentWindow,attrs,viewVisibility,...);// 4. 计算 Z 层win.mBaseLayermPolicy.getWindowLayerLw(win);win.mSubLayermPolicy.getSubWindowLayerFromTypeLw(attrs.type);// 5. 注册到全局映射mWindowMap.put(client.asBinder(),win);token.addWindow(win);// 6. 创建输入通道win.openInputChannel(outInputChannel);returnADD_OKAY;}WMS.relayoutWindow()publicintrelayoutWindow(Sessionsession,IWindowclient,intseq,LayoutParamsattrs,intrequestedWidth,intrequestedHeight,intviewFlags,intflags,ClientWindowFramesoutFrames,SurfaceControloutSurfaceControl,...){// 1. 查找窗口WindowStatewinwindowForClientLocked(session,client,false);// 2. 更新可见性win.setViewVisibility(viewFlags);// 3. 创建 SurfaceControlif(shouldRelayoutoutSurfaceControl!null){win.createSurfaceControl(outSurfaceControl);}// 4. 执行全局布局mWindowPlacerLocked.performSurfacePlacement();// 5. 返回计算结果outFrames.frame.set(win.getFrame());outFrames.display.set(win.getDisplayFrame());returnwin.getRelayoutResult();}十、总结维度说明定位窗口管理中枢不渲染只管理核心对象WindowState窗口状态、WindowToken令牌归组、DisplayContent屏幕三大流程addWindow注册→ relayoutWindow布局Surface→ finishDrawing显示Z-Order窗口类型映射到 Layer高 Layer 遮挡低 Layer输入分发InputDispatcher 借助 WMS 窗口信息做 hit-testing启动线程system_server 阻塞等 android.display 创建 WMS再阻塞等 android.ui 初始化策略