Ahao's Technical Blog Ahao's Technical Blog
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

阿豪讲Framework

不积跬步无以至千里
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础篇

  • 玩转AOSP篇

  • 学穿Binder篇

  • 基础组件篇

  • 系统启动过程分析

  • Hal开发入门与实践

  • 显示系统

    • 如何调试 SurfaceFlinger
    • HWC 接口分析
    • SurfaceFlinger 概述
      • 1. SurfaceFlinger 在显示系统的位置
        • 1.1 承上:作为上层应用的消费者​
        • 1.2 启下:作为底层硬件的生产者​
      • 2. SurfaceFlinger 的组成
      • 3. SurfaceFlinger 的核心功能总结
      • 参考资料
    • 启动过程总览
    • SurfaceFlinger 初始化
    • RenderEnginge 初始化
  • Framework
  • 显示系统
阿豪
2025-10-05
目录

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 调度、线程事件轮询等任务

20250812200210

# 3. SurfaceFlinger 的核心功能总结

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

20250529214611

  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概述及启动过程 (opens new window)
  2. Native App 与 SurfaceFinger 建立 Binder 通信过程分析 (opens new window)
#显示系统
HWC 接口分析
启动过程总览

← HWC 接口分析 启动过程总览→

最近更新
01
如何调试 SurfaceFlinger
10-05
02
HWC 接口分析
10-05
03
启动过程总览
10-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 AHao Framework | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式