It's our wits that make us men.

← 源码笔记
Surface、SurfaceControl 与 SurfaceFlinger 源码分析

Surface、SurfaceControl 与 SurfaceFlinger 源码分析

1. 概述

这三者是 Android 图形系统的核心三角关系,分别承担 缓冲区操作元数据控制合成输出 的职责。

组件 定位 进程 层级
Surface 图形缓冲区的生产者端口,负责往 buffer 里写像素 App 进程 Java + Native
SurfaceControl 图层的遥控器,控制位置/大小/透明度/Z序等元数据 App / SystemServer Java + Native
SurfaceFlinger 系统级合成器服务,将所有 Layer 合成为最终帧送显 surfaceflinger 进程 Native

核心关系一句话:App 通过 Surface 向 BufferQueue 提交图形数据,通过 SurfaceControl.Transaction 告诉 SurfaceFlinger 如何摆放这些图层,SurfaceFlinger 将所有图层合成后送往屏幕。


2. 各组件详解

2.1 Surface — 缓冲区的”画布”

源码位置

官方定义 (Surface.java):

Handle onto a raw buffer that is being managed by the screen compositor. A Surface is generally created by or from a consumer of image buffers, and is handed to some kind of producer to draw into.

Native 层定义 (Surface.h):

An implementation of ANativeWindow that feeds graphics buffers into a BufferQueue. This is typically used by programs that want to render frames through some means (maybe OpenGL, a software renderer, or a hardware decoder) and have the frames they create forwarded to SurfaceFlinger for compositing.

核心职责

关键方法

方法 作用
dequeueBuffer() 从 BufferQueue 获取空闲 buffer,App 在此 buffer 上渲染
queueBuffer() 将渲染好的 buffer 提交给 BufferQueue,触发消费者回调
lockCanvas(Rect) 软件渲染:锁定 buffer 并返回 Canvas
unlockCanvasAndPost(Canvas) 软件渲染:解锁并提交 buffer
lockHardwareCanvas() 硬件加速渲染:返回硬件 Canvas

关键字段 (Native 层):

字段 类型 作用
mGraphicBufferProducer sp<IGraphicBufferProducer> 连接 BufferQueue 的生产者端
mSlots[NUM_BUFFER_SLOTS] BufferSlot[] 本地 buffer 缓存,避免重复 Binder 传输

2.2 SurfaceControl — 图层的”遥控器”

源码位置

官方定义 (SurfaceControl.java):

Handle to an on-screen Surface managed by the system compositor. The SurfaceControl is a combination of a buffer source, and metadata about how to display the buffers. SurfaceControls are arranged into a scene-graph like hierarchy, and as such any SurfaceControl may have a parent. Geometric properties like transform, crop, and Z-ordering will be inherited from the parent, as if the child were content in the parents buffer stream.

核心职责

Transaction 关键操作

Transaction t = new SurfaceControl.Transaction();
t.setPosition(sc, x, y);          // 位置
t.setLayer(sc, z);                 // Z 序
t.setAlpha(sc, 0.8f);             // 透明度
t.setCrop(sc, rect);              // 裁剪区域
t.setScale(sc, sx, sy);           // 缩放
t.setCornerRadius(sc, radius);    // 圆角
t.setMatrix(sc, dsdx, dtdx, dtdy, dsdy); // 变换矩阵
t.setBackgroundBlurRadius(sc, r); // 背景模糊
t.show(sc);                        // 显示
t.hide(sc);                        // 隐藏
t.reparent(sc, newParent);        // 重新挂载父节点
t.apply();                         // 原子提交到 SurfaceFlinger

Transaction 原子性原理

Native createSurface() 流程

SurfaceComposerClient::createSurface()
  → mClient->createSurface() (AIDL Binder)
  → SurfaceFlinger 创建 Layer 对象
  → 返回 handle, layerId, layerName, transformHint
  → 构造 SurfaceControl 对象返回给调用者

2.3 SurfaceFlinger — 系统合成器

源码位置

核心职责

init() 初始化流程

  1. 创建 RenderEngine(GPU 渲染引擎)
  2. 初始化 HWComposer(硬件合成器抽象层)
  3. 调用 configureLocked() 处理初始 Display 热插拔
  4. 初始化 Scheduler(VSync 和帧调度)
  5. 建立主显示设备

合成流程(VSync 驱动)

VSync 信号到来
  → commitTransactions()    // 应用所有待处理的 Transaction
  → latchBufferImpl()       // 锁定每个 Layer 的最新 buffer
  → composite()             // 通过 CompositionEngine 合成所有可见 Layer
  → present to Display      // 通过 HWComposer 送显
  → releaseBuffer()         // 释放已显示的 buffer,返回给生产者

Layer 核心状态 (Layer.h State 结构体):

字段 作用
sequence Layer 排序序号
buffer 当前图形缓冲区
crop, transform 空间变换信息
frameNumber, frameTimelineInfo 帧同步时间信息
acquireFence, acquireFenceTime 同步原语(生产者完成渲染的信号)
desiredPresentTime 期望呈现时间

3. BufferQueue — 连接 Surface 和 SurfaceFlinger 的桥梁

源码位置

BufferQueue 是 Surface(生产者)和 SurfaceFlinger Layer(消费者)之间的缓冲区管道。

创建流程 (BufferQueue.cpp):

BufferQueue::createBufferQueue()
   创建 BufferQueueCore(共享状态)
   创建 BufferQueueProducer(生产者 API
   创建 BufferQueueConsumer(消费者 API
   返回两端接口给调用者

Buffer 状态机

FREE → DEQUEUED → QUEUED → ACQUIRED → FREE
 ↑        |                     |
 └────────┘ (cancelBuffer)      └── (releaseBuffer)

Fence 同步机制


4. 三者关联 — 时序图

sequenceDiagram
    participant App as App 进程
    participant S as Surface
    participant BQ as BufferQueue
    participant SC as SurfaceControl
    participant SF as SurfaceFlinger
    participant HWC as HWComposer
    participant Display as 屏幕

    Note over App,Display: ========== 初始化阶段 ==========
    App->>SF: SurfaceComposerClient.createSurface()
    SF->>SF: 创建 Layer 对象
    SF-->>App: 返回 SurfaceControl (图层句柄)
    App->>SC: new Surface(surfaceControl)
    SC->>BQ: 关联 IGraphicBufferProducer
    SC-->>App: 返回 Surface (可绘制的画布)

    Note over App,Display: ========== 每帧渲染阶段 ==========
    App->>S: dequeueBuffer()
    S->>BQ: 请求空闲 buffer
    BQ-->>S: GraphicBuffer + releaseFence
    S-->>App: 可写入的 buffer

    App->>App: OpenGL/Canvas 渲染到 buffer

    App->>S: queueBuffer(acquireFence)
    S->>BQ: 提交已渲染 buffer
    BQ->>SF: onFrameAvailable() 回调

    Note over App,Display: ========== Transaction 控制阶段 ==========
    App->>SC: Transaction.setPosition/setAlpha/...
    SC->>SF: setTransactionState() (Binder)
    SF->>SF: 缓存 pending transaction

    Note over App,Display: ========== 合成阶段 (VSync 驱动) ==========
    SF->>SF: commitTransactions() 应用状态
    SF->>SF: latchBufferImpl() 锁定最新 buffer
    SF->>HWC: 提交合成任务
    HWC->>Display: 显示最终帧
    HWC-->>SF: 返回 releaseFence
    SF->>BQ: releaseBuffer(releaseFence)

5. 架构总览图

┌─────────────────────────────────────────────────────┐
│                    App 进程                          │
│                                                     │
│  ┌──────────────┐         ┌───────────────────┐     │
│  │   Surface     │         │  SurfaceControl   │     │
│  │  (画布/Buffer) │         │  (图层遥控器)      │     │
│  │              │         │                   │     │
│  │ lockCanvas() │         │ Transaction {     │     │
│  │ queueBuffer()│         │   setPosition()   │     │
│  │              │         │   setAlpha()       │     │
│  └──────┬───────┘         │   setLayer()       │     │
│         │                 │   apply() ─────────┼──┐  │
│         │                 │ }                  │  │  │
│         │                 └───────────────────┘  │  │
└─────────┼────────────────────────────────────────┼──┘
          │ IGraphicBufferProducer                 │ ISurfaceComposer
          │ (Binder)                               │ setTransactionState()
          ▼                                        │ (Binder)
┌─────────────────────┐                            │
│    BufferQueue       │                            │
│ ┌─────┬─────┬─────┐ │                            │
│ │slot0│slot1│slot2│ │  ← 通常 3 个 buffer         │
│ └──┬──┴──┬──┴──┬──┘ │    (triple buffering)      │
│    │     │     │     │                            │
└────┼─────┼─────┼─────┘                            │
     │     │     │ IGraphicBufferConsumer            │
     ▼     ▼     ▼                                  ▼
┌─────────────────────────────────────────────────────┐
│              SurfaceFlinger 进程                     │
│                                                     │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐            │
│  │ Layer A  │  │ Layer B  │  │ Layer C  │  ...      │
│  │(状态栏)  │  │(App窗口) │  │(导航栏)  │            │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘            │
│       │             │             │                  │
│       ▼             ▼             ▼                  │
│  ┌──────────────────────────────────────┐           │
│  │        CompositionEngine             │           │
│  │   (按 Z 序合成所有可见 Layer)          │           │
│  └──────────────┬───────────────────────┘           │
│                 │                                    │
│                 ▼                                    │
│  ┌──────────────────────┐                           │
│  │     HWComposer       │  ← 硬件合成 or GPU 合成    │
│  └──────────┬───────────┘                           │
└─────────────┼───────────────────────────────────────┘
              │
              ▼
         ┌──────────┐
         │  Display  │  ← 屏幕显示
         └──────────┘

6. 核心数据结构汇总

类名 关键字段 作用
Surface (Native) mGraphicBufferProducer 连接 BufferQueue 的生产者端
Surface (Native) mSlots[NUM_BUFFER_SLOTS] 本地 buffer 缓存,避免重复 Binder 传输
SurfaceControl (Java) mNativeObject (long) 指向 native SurfaceControl 的指针
SurfaceControl.Transaction mNativeObject (long) 指向 native Transaction 的指针,内部维护状态变更列表
SurfaceFlinger::Layer mDrawingState 当前参与合成的图层状态
SurfaceFlinger::Layer mBufferInfo 当前活跃 buffer 的元数据
BufferQueueCore mSlots[] slot 数组,维护空闲/入队/出队状态机
BufferQueueProducer mCore 生产者端操作 BufferQueue
BufferQueueConsumer mCore 消费者端操作 BufferQueue

7. 要点总结

设计意图 — 职责分离

关注点 由谁负责 为什么分离
像素数据(画什么) Surface + BufferQueue App 端渲染,通过共享内存避免跨进程拷贝大量像素
显示属性(怎么摆) SurfaceControl.Transaction 轻量 Binder 调用,原子提交保证一致性
最终合成(合在一起) SurfaceFlinger 统一调度,全局优化合成策略

关键机制

  1. BufferQueue 生产者-消费者模型:Surface 是生产者端,SurfaceFlinger(通过 Layer)是消费者端。通过 Fence 机制实现 GPU/CPU 无锁同步,不需要等待 GPU 完成就能提交下一帧。

  2. Transaction 原子性:多个图层属性变更打包在一个 Transaction 中,调用 apply() 后通过一次 Binder 调用 setTransactionState() 送达 SurfaceFlinger,保证一帧内所有变更同时生效,避免画面撕裂。

  3. Triple Buffering:BufferQueue 通常维护 3 个 buffer slot,使得 App 渲染和 SurfaceFlinger 合成可以流水线化:App 写 buffer A,SurfaceFlinger 读 buffer B,buffer C 待命,减少卡顿。

  4. VSync 驱动:SurfaceFlinger 的合成由 Scheduler 管理的 VSync 信号驱动,保证帧率稳定。App 端的 Choreographer 也由 VSync 驱动,形成完整的帧同步链路。

  5. 共享内存零拷贝:GraphicBuffer 底层使用 gralloc 分配的共享内存(通过 ION/dmabuf),App 和 SurfaceFlinger 映射同一块物理内存,避免像素数据的跨进程拷贝。

与背屏开发的关联


8. 源码路径索引

组件 文件路径
Surface (Java) frameworks/base/core/java/android/view/Surface.java
Surface (Native) frameworks/native/libs/gui/Surface.cpp
Surface (Header) frameworks/native/libs/gui/include/gui/Surface.h
SurfaceControl (Java) frameworks/base/core/java/android/view/SurfaceControl.java
SurfaceComposerClient frameworks/native/libs/gui/SurfaceComposerClient.cpp
SurfaceComposerClient (Header) frameworks/native/libs/gui/include/gui/SurfaceComposerClient.h
SurfaceFlinger frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp/.h
Layer frameworks/native/services/surfaceflinger/Layer.cpp/.h
BufferQueue frameworks/native/libs/gui/BufferQueue.cpp
BufferQueueProducer frameworks/native/libs/gui/BufferQueueProducer.cpp

9. 推荐阅读

← 返回目录