【窗口】分层角度来整体地理解 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,内部通过 WindowManagerGlobal 和 IWindowSession 进行 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 | 一块物理显示屏上的全部窗口的容器。 |
Session | IWindowSession 的系统端实现,代表 App 与 WMS 的连接会话。 |
SurfaceControl | Framework 控制 SurfaceFlinger 创建 / 更新图层的入口类。 |
Surface | App 用来绘制内容的对象,与 SurfaceControl 创建的 BufferQueue 对接。 |
InputManagerService / InputDispatcher | 接收底层输入事件,将事件分发到对应的窗口。 |
WindowStateAnimator | 管理单个窗口的 Surface 和动画,包括创建、销毁 Surface、应用屏幕旋转、动画过渡等。 |
作用总结:
- Framework 层是窗口管理的“大脑”,通过 WMS 协调所有窗口状态。
- 通过
SurfaceControl向 SurfaceFlinger 注册图层,并维持 App → 图层 → 显示的映射关系。 - 控制输入事件和窗口的焦点。
- 与 ActivityManagerService 协作决定窗口是否显示(Activity 生命周期)。
3. SurfaceFlinger 层(系统渲染合成进程)
SurfaceFlinger 是一个独立的系统服务进程,负责所有 Layer(图层)的最终合成与输出到显示屏。
| 类 | 作用 |
|---|---|
SurfaceFlinger | 主服务类,接收 Framework 发来的 Layer 操作,管理所有显示屏上的 Layer Tree,并调用硬件合成接口。 |
Layer | SurfaceFlinger中实际绘制的图层对象,对应 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 渲染)。
完整链路描述
窗口创建 & 绘制的流程:
-
App 层发起窗口创建
Activity 启动,PhoneWindow构建 View 树 →WindowManager.addView()→IWindowSession.add()Binder 调用。 -
Framework 层管理窗口
- WMS 在 System Server 创建
WindowState,设置 LayoutParams、显示层级等。 - WMS 调用
SurfaceControl创建 Layer,对应的 BufferQueue 在 App 端可用。
- WMS 在 System Server 创建
-
App 绘制内容
- App 在
ViewRootImpl中通过Surface拿到 BufferQueue 的生产端,渲染 View 树到 Buffer(通常通过 Canvas 或硬件加速)。 - Buffer 进入队列等待 SurfaceFlinger 消费。
- App 在
-
SurfaceFlinger 合成
- 接收来自多个窗口的 Buffer,按照 Z-order、透明度处理。
- 调用 HWComposer
prepare()确定哪些 Layer 走硬件 Overlay,哪些走 GPU 合成。 set()提交合成结果到显示硬件。
-
硬件显示
- Display Controller 或 GPU 完成最后的像素混合并输出到屏幕。
- 硬件发送 VSync 信号 → SurfaceFlinger 通知 App 绘制下一帧。
💡 总结:
- App 层:负责构建和渲染窗口内容 (
ViewRootImpl/WindowManager)。 - Framework 层:负责窗口管理、布局、输入及 SurfaceControl 操作 (
WindowManagerService/WindowState)。 - SurfaceFlinger:负责全局图层合成,调用 HWComposer。
- HWComposer / SoC 层:利用硬件加速高效合成并输出显示。
如果你愿意,我可以帮你画一个 垂直分层的架构图,把这些类和作用按层直观地连起来,你觉得要画吗?这样比文字更容易记住整个链路。
