深入理解 SurfaceFlinger —— 概述

SurfaceFlinger 系列文章持续更新中(公众号:阿豪讲Framework):

  • 如何调试 SurfaceFlinger
  • SurfaceFlinger 概述
  • 启动过程总览
  • SurfaceFlinger 对象初始化
  • ........

本文基于 AOSP android-15.0.0_r20 版本源码和 pixel6 手机分析。

1. SurfaceFlinger 在显示系统的位置

SurfaceFlinger 是 Android 图形系统的​核心引擎​​,承担着 ​​合成、同步、资源管理​​ 等核心职责。其性能直接决定系统流畅度与能效,尤其在多窗口、高刷新率等场景下是不可替代的底层基石。开发者需深入理解其机制,以优化显示性能或解决显示异常问题。

SurfaceFlinger 在整个显示系统中是一个承上启下的角色:

1.1 承上:作为上层应用的消费者​

  1. 管理应用图形数据(Surface 与 BufferQueue)
    • 每个应用窗口(如 Activity、状态栏)对应一个 Surface,它是应用绘制的画板,通过 Canvas 或 OpenGL ES 写入图形数据
    • Surface 内部通过 BufferQueue 管理与 SurfaceFlinger 的数据交互:
      • 应用(生产者):通过 dequeueBuffer 获取空闲缓冲区,绘制完成后通过 queueBuffer 提交到队列
      • SurfaceFlinger(消费者):从 BufferQueue 的队列头获取已提交的缓冲区(状态:Queued → Acquired),用于后续合成
    • 这一机制解耦了应用绘制与显示合成,并支持多 Buffer 避免阻塞
  2. 响应窗口管理与事务更新
    • WindowManager 创建窗口时分配 SurfaceControl,应用通过它更新窗口属性(位置、透明度等)
    • 属性变更以 Transaction 形式批量提交
  3. 同步绘制节奏(VSync 信号)
    • SurfaceFlinger 通过 Choreographer 向应用分发 VSync 信号,触发应用在下一个刷新周期开始绘制,避免帧率与刷新率失步导致的卡顿或撕裂

1.2 启下:作为底层硬件的生产者​

  1. 图形合成与显示输出
  • SurfaceFlinger 将所有 Layer(对应 Surface)合成为最终帧,通过两种方式:
    • GPU 合成(RenderEngine):使用 OpenGL ES/Vulkan 处理复杂特效(如旋转、缩放),灵活性高但会和 App 绘制过程抢占 GPU 资源,同时功耗高。
    • 硬件合成(HWC):通过 Hardware Composer HAL 直接调用显示硬件(如 DSP)合成,效率高、功耗低,但受硬件限制,不支持复杂效果。
  • 典型合成策略:HWC 优先处理简单 Layer(如视频播放),复杂操作回退到 GPU
  1. 缓冲区与显示硬件的桥梁

    • 合成后的帧通过 Gralloc 模块分配的缓冲区传递到显示控制器(Display Controller)。
    • SurfaceFlinger 调用 Output::present 将 Buffer 给到 HWC HAL 完成显示,利用 VSync 信号同步提交到屏幕,确保无撕裂
  2. 资源管理与多屏适配

    • 管理图形缓冲区生命周期(释放/复用),减少内存分配开销。
    • 支持多屏幕输出(如扩展屏)、动态分辨率切换,通过 HAL 抽象层适配不同显示硬件

2. SurfaceFlinger 的组成

功能上可以把 SurfaceFlinger 相关成员划分为 4个部分:

  • SurfaceFlinger 部分,核心功能,几乎所有的对外接口,最终都会调用到 Surfa1ceFlinger 的成员函数中,是合成过程的总管家
  • CompositionEngine 部分,负责图层的合成工作,
    • RenderEngine 部分,在 GPU 合成时,对图层进行渲染和绘制
  • HWC 客户端部分,负责与 Hardware Composer HAL 的 Binder 通信
  • 调度器部分,负责 VSYNC 调度、线程事件轮询等任务

3. SurfaceFlinger 的核心功能总结

  1. 图形合成(Composition)
    • 将多个应用窗口(Surface)的绘制内容合成为单一的屏幕帧。
    • 根据窗口的 Z 轴顺序、透明度、位置和大小进行图层叠加与混合计算。
    • 支持通过 OpenGL ES/Vulkan(GPU 合成)或 Hardware Composer(HWC)(硬件叠加层)实现高效合成
      • 优先使用 HWC 进行硬件合成(如视频播放、相机预览),降低 GPU/CPU 负载
      • 对不支持硬件合成的图层,回退到 GPU 合成
  1. 显示同步管理(VSync)

    • 接收显示设备的 VSync 信号,协调应用绘制与屏幕刷新的时序,避免画面撕裂。
    • 通过 EventThread 线程处理 VSync 事件,触发合成流程
    • 屏幕刷新率管理
  2. ​缓冲区管理(BufferQueue)

    • 通过 BufferQueue 机制协调生产者(应用)与消费者(SurfaceFlinger):
      • 应用作为生产者,将图像数据写入后缓冲区(Back Buffer)。
      • SurfaceFlinger 作为消费者,读取缓冲区并合成到前缓冲区(Front Buffer)。
    • 采用双/三缓冲机制,避免绘制过程中的显示闪烁
  3. 窗口层级与区域裁剪

    • 管理窗口的 Z-order 序列,计算重叠区域的可见性(如 VisibleRegion、DirtyRegion)。
    • 动态识别脏区域(DirtyRegion),仅更新变化部分以提升性能
  4. 显示设备管理

    • 显示设备的抽象与分类
    • 显示设备的生命周期管理

除了这些核心功能,SurfaceFlinger 还有一些有意思的特性:

  • 录屏功能
  • 动态调整不同应用的 RenderRate
  • ......(持续发掘中)

参考资料

  1. SurfaceFlinger01-SurfaceFlinger概述及启动过程
  2. Native App 与 SurfaceFinger 建立 Binder 通信过程分析
相关推荐
千里马学框架5 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台5 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone5 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc5 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo5 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077005 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼5 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone5 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen5 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone5 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui