当前位置: 首页 > backend >正文

Android WindowManagerService(WMS)框架深度解析

目录

一、什么是WMS?‌

‌二、WMS 的架构层次‌

1. 主要分层与工作流程

1‌.1 客户端层

1‌.2 服务层‌

1‌.3 底层驱动‌

2. 跨层协作流程

2.1 跨层协作示意图

2.2 底层与上层交互机制

2.2.1 图形缓冲区交互通道

2.2.2  输入事件传递链路

2.3 服务层响应客户端请求流程

2.3.1 客户端请求处理链

2.3.2. 核心响应逻辑示例

2.3.3 异步回调机制

‌三、核心模块与工作流程‌

1. ‌核心模块‌

2. ‌窗口添加流程

3. ‌布局与绘制流程

‌四、WMS 的启动流程‌

五、核心代码解析‌


一、什么是WMS?

WindowManagerService(WMS)‌ 是 Android 系统中负责管理窗口的核心服务,其职责包括窗口的创建、层级排序、布局、动画、输入事件分发以及与 SurfaceFlinger 协同完成图形合成。WMS 是 Android GUI 系统的中枢,直接影响应用的显示、交互和多任务处理。主要功能包括:

  • 窗口生命周期管理‌:处理窗口的添加、删除、层级调整(Z-Order)。

  • 布局与绘制‌:通过 performLayoutAndPlaceSurfacesLocked 计算窗口位置,触发 Surface 更新。

  • 输入事件分发‌:与 InputManagerService 协同,将触摸事件路由到焦点窗口。

  • 动画处理‌:窗口切换、过渡动画的管理(如 WindowAnimator)。

  • 多窗口模式‌:支持分屏、画中画、自由窗口等模式。

  • 显示管理‌:与 DisplayManagerService 协作处理多屏显示。

二、WMS 的架构层次

1. 主要分层与工作流程

1‌.1 客户端层

‌通过Binder IPC机制向WMS服务发起窗口操作请求,处理用户交互事件的分发。包括 WindowViewRootImpl 和应用进程,负责发起窗口操作请求(如添加/删除窗口)。其工作流程如下

  • 窗口创建‌:应用通过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. 分配Surfacewin.createSurfaceControl();}
    }
    

1‌.3 

http://www.xdnf.cn/news/1853.html

相关文章:

  • Python命名参数的使用
  • 从『玩意儿』代码综观『解决问题』的方案设计逻辑——开放/细致/『明理』(DeepSeek)
  • 基于javaweb的SSM+Maven红酒朔源管理系统设计与实现(源码+文档+部署讲解)
  • 3000年不识伪全等直线段使数学一直有将两异直线段误为同一线段的重大错误——百年病态集论的症结
  • DeepSeek回答过于笼统,提示词如何优化
  • 【金仓数据库征文】-数据库界新兴前列者,本篇带你速懂金仓数据库!
  • 深度学习之卷积神经网络入门
  • 使用idea打包maven项目的时候因为java文件多导致java.lang.OutOfMemoryError: Java heap space
  • 【金仓数据库征文】——选择金仓,选择胜利
  • 【论文推荐】人工智能在滑坡风险评估三大核心领域的应用:人工智能技术在滑坡风险评估中的方法学综述
  • 前端基础之《Vue(10)—过滤器》
  • Linux命令行基础入门详解
  • Python3(8) 字符串
  • fastjson使用parseObject转换成JSONObject出现将字符特殊字符解析解决
  • attention-transformer-test
  • Agent智能体应用详解:从理论到实践的技术探索
  • AD16批量修改PCB元件序号的高度和宽度
  • Python 学习路线与笔记跳转(持续更新笔记链接)
  • 接口测试和单元测试详解
  • 浔川代码编辑器v2.0(测试版)更新公告
  • 手搓实时操作系统实践:从零构建属于自己的系统世界
  • maven构建时报错:was cached in the local repository...
  • Spring Boot知识点详解
  • 简单场景下的目标关联算法:GNN全局最近邻与匈牙利算法
  • express响应设置 以及redirect,download,json.sendFdile
  • Java 2025 技术全景与实战指南:从新特性到架构革新
  • 如何使用 CompletableFuture、Function 和 Optional 优雅地处理异步编程?
  • win11中wsl在自定义位置安装ubuntu20.04 + ROS Noetic
  • 自动化测试概念及常用函数篇 [软件测试 基础]
  • 算法训练营第二天| 209.长度最小的子数组、59.螺旋矩阵II、区间和