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

【窗口】分层角度来整体地理解 Android 窗口系统

好的,你想从 分层角度 来整体地理解 Android 窗口系统中 WindowState 所处的位置,以及 App → Framework → SurfaceFlinger → HWC 的整个链路。
我会按 应用层(App)→ Framework 层 → SurfaceFlinger → SoC 硬件层(HWComposer) 逐层讲解涉及的主要类和它们的作用,并把它们串成一个完整的流程。


1. 应用层(App 层)

App 层是开发者写的应用所在的用户进程,这一层的窗口相关类主要包括:

类/接口作用
Activity / Dialog / PopupWindow这些是 Android UI 元素的入口,最终都会作为一个窗口向系统申请显示。
View / ViewGroup构成 UI 树,ViewRootImpl 会管理它们的绘制和事件分发。
ViewRootImpl应用窗口与系统的桥梁,负责将 绘制请求 / 输入事件 在 App 与 WindowManagerService 之间传递。会通过 Binder 调用 IWindowSession 接口来添加、更新窗口。
Window(抽象类) / PhoneWindow描述窗口顶层容器,PhoneWindow 是 Activity 默认实现,用来装载 View 树。
WindowManager应用端管理窗口的入口 API,内部通过 WindowManagerGlobalIWindowSession 进行 IPC 调用系统服务。
IWindow(Binder 接口)系统回调应用的窗口对象,例如通知绘制、布局变化、输入事件等。
IWindowSession(Binder 接口)App 通过它向 WMS 请求添加、更新、移除窗口。

作用总结

  • App 层负责构建 View 树和窗口布局参数,通过 WindowManager 调用 WindowManagerService 请求系统创建窗口。
  • ViewRootImpl 既接收系统回调进行绘制,也将 App 端 Layout/Draw 请求交给 Choreographer → RenderThread → Surface。

2. Framework 层(系统服务进程 System Server)

Framework 层运行在 System Server 进程,提供窗口管理核心功能,主要类如下:

作用
WindowManagerService (WMS)Window 管理核心服务,接收 App 端请求,为每个窗口创建一个 WindowState 实例,负责窗口布局、层级、可见性管理、输入区域管理等。
WindowState表示单个窗口在系统中的状态,包含布局参数、可见状态、Surface 句柄等信息。
WindowToken一组相关窗口的标识(例如同一个 Activity 的主窗口和子窗口共享一个 Token)。
DisplayContent一块物理显示屏上的全部窗口的容器。
SessionIWindowSession 的系统端实现,代表 App 与 WMS 的连接会话。
SurfaceControlFramework 控制 SurfaceFlinger 创建 / 更新图层的入口类。
SurfaceApp 用来绘制内容的对象,与 SurfaceControl 创建的 BufferQueue 对接。
InputManagerService / InputDispatcher接收底层输入事件,将事件分发到对应的窗口。
WindowStateAnimator管理单个窗口的 Surface 和动画,包括创建、销毁 Surface、应用屏幕旋转、动画过渡等。

作用总结

  • Framework 层是窗口管理的“大脑”,通过 WMS 协调所有窗口状态。
  • 通过 SurfaceControl 向 SurfaceFlinger 注册图层,并维持 App → 图层 → 显示的映射关系。
  • 控制输入事件和窗口的焦点。
  • 与 ActivityManagerService 协作决定窗口是否显示(Activity 生命周期)。

3. SurfaceFlinger 层(系统渲染合成进程)

SurfaceFlinger 是一个独立的系统服务进程,负责所有 Layer(图层)的最终合成与输出到显示屏。

作用
SurfaceFlinger主服务类,接收 Framework 发来的 Layer 操作,管理所有显示屏上的 Layer Tree,并调用硬件合成接口。
LayerSurfaceFlinger中实际绘制的图层对象,对应 Framework 的 SurfaceControl
BufferQueue一对生产者(App / RenderThread)和消费者(SurfaceFlinger)的缓冲队列,App 在生产者端绘制,SF 在消费者端合成。
DisplayDevice表示一个物理显示设备(屏幕),绑定到一个 Layer Stack。
RenderEngine如果硬件不能直接合成,会调用 OpenGL ES 或 Vulkan 渲染来合成图层。
HWComposer 接口与硬件抽象层的 HWComposer 通信,请求硬件合成不同的 Layer。

作用总结

  • SurfaceFlinger 是最终画面合成器,从 BufferQueue 中取出最新的所有 Layer Buffer,根据 Z-order、透明度等信息合成。
  • 对能用硬件合成的 Layer 调用 HWC,降低 CPU/GPU 使用。
  • 维护 VSync 时间轴,驱动 App 绘制节奏。

4. SoC 硬件层(HAL 层 HWComposer)

HWComposer 是硬件抽象层的模块,由 SoC 厂商实现(通常是 GPU/显示控制驱动),提供硬件加速的 Layer 合成能力。

组件作用
hwcomposer HAL定义标准接口(prepare() / set()),SurfaceFlinger 调用它来让硬件合成图层。
显示控制器(Display Controller)在硬件中将不同的 Layer 混合输出到屏幕。显示控制器可能支持多 plane(Overlay),能在不使用 GPU 的情况下合成 UI / 视频等。
GPU如果硬件合成限制,交给 GPU 来进行图形渲染合成。
VSync 信号源硬件产生的垂直同步信号,用来驱动 SurfaceFlinger / App 绘制节奏。

作用总结

  • HWComposer 通过 Overlay 或硬件 mixer 将 Layer 合并为一帧,减少软件合成开销。
  • 提供 VSync 回调来驱动帧同步。
  • 不同厂商可以优化 Layer 合成路径(例如视频用独立 plane,UI 用 GPU 渲染)。

完整链路描述

窗口创建 & 绘制的流程

  1. App 层发起窗口创建
    Activity 启动,PhoneWindow 构建 View 树 → WindowManager.addView()IWindowSession.add() Binder 调用。

  2. Framework 层管理窗口

    • WMS 在 System Server 创建 WindowState,设置 LayoutParams、显示层级等。
    • WMS 调用 SurfaceControl 创建 Layer,对应的 BufferQueue 在 App 端可用。
  3. App 绘制内容

    • App 在 ViewRootImpl 中通过 Surface 拿到 BufferQueue 的生产端,渲染 View 树到 Buffer(通常通过 Canvas 或硬件加速)。
    • Buffer 进入队列等待 SurfaceFlinger 消费。
  4. SurfaceFlinger 合成

    • 接收来自多个窗口的 Buffer,按照 Z-order、透明度处理。
    • 调用 HWComposer prepare() 确定哪些 Layer 走硬件 Overlay,哪些走 GPU 合成。
    • set() 提交合成结果到显示硬件。
  5. 硬件显示

    • Display Controller 或 GPU 完成最后的像素混合并输出到屏幕。
    • 硬件发送 VSync 信号 → SurfaceFlinger 通知 App 绘制下一帧。

💡 总结:

  • App 层:负责构建和渲染窗口内容 (ViewRootImpl / WindowManager)。
  • Framework 层:负责窗口管理、布局、输入及 SurfaceControl 操作 (WindowManagerService / WindowState)。
  • SurfaceFlinger:负责全局图层合成,调用 HWComposer。
  • HWComposer / SoC 层:利用硬件加速高效合成并输出显示。

如果你愿意,我可以帮你画一个 垂直分层的架构图,把这些类和作用按层直观地连起来,你觉得要画吗?这样比文字更容易记住整个链路。

http://www.dtcms.com/a/602385.html

相关文章:

  • 网站网页设计制作公司建立wordpress网站吗
  • CesiumJS 案例 P35:添加图片图层(添加图片数据)
  • 贞丰县住房和城乡建设局网站门户网站建设采购
  • Apache DolphinScheduler 新增 gRPC 任务插件 | 开源之夏成果总结
  • 网站数据迁移教程汕头快速建站模板
  • MATLAB中生成混淆矩阵
  • 基于MATLAB的验证码识别系统实现
  • 路由器怎么做网站百度下载
  • Spark简介以及K8S部署
  • 网站顶部图片素材官方网站建设条件
  • 高端电商网站建设上海频道网站建设公司
  • Ubuntu 中的编程语言(中)
  • 不确定知识图谱(UKGs)增强中医药大模型:药食同源个性化膳食推荐的智能化新突破
  • 有哪些适合自学口语的软件?
  • 算法1111
  • 大牌印花图案设计网站工信部怎么查网站备案
  • 做网站需要走哪些程序建筑模板制作过程
  • 《POE 免布线:100 平米机房以太网温湿度便捷部署方案》
  • 做优化网站是什么意思浏览器下载WordPress文件
  • 纯静态网站制作开发公司对代理公司管理
  • 龙海网站开发如何建立和设置公司网站
  • 宜昌教育培训网站建设深圳宝安中学家长群
  • 做网站违反广告法wordpress全站转移
  • Ubuntu 怎么把树莓派内存卡备份制作成为镜像
  • 做淘客网站怎么教育局网站群建设方案
  • Ubuntu 24.04 安装开源WebRTC信令服务器
  • 滨州做微商城网站手机网站源码最好
  • 各态历经性-随机过程
  • 企业网站建设推广方案怎么写西双版纳网站建设
  • 企业微信消息推送系统设计:基于ES(事件溯源思想)解耦规则与任务架构