概述
本文档基于当前工程中的 AOSP 源码,系统地阐述 Android 图形渲染流水线的完整架构与执行流程。按照数据流向,将渲染流水线划分为四个阶段进行深入解析:
-
应用层视图绘制阶段 --- UI 线程上的 View 树遍历与 DisplayList 构建
-
RenderThread 渲染处理阶段 --- 异步渲染管线与 GraphicBuffer 产出
-
SurfaceFlinger 图层合成阶段 --- 图层管理与合成策略决策
-
Hardware Composer 硬件合成阶段 --- 硬件合成器接口与显示输出
核心源码路径索引
| 阶段 | 关键文件 | 路径 |
|---|---|---|
| 应用层 | ViewRootImpl.java | frameworks/base/core/java/android/view/ViewRootImpl.java |
| 应用层 | ThreadedRenderer.java | frameworks/base/core/java/android/view/ThreadedRenderer.java |
| 应用层 | HardwareRenderer.java | frameworks/base/graphics/java/android/graphics/HardwareRenderer.java |
| 应用层 | RecordingCanvas.java | frameworks/base/graphics/java/android/graphics/RecordingCanvas.java |
| RenderThread | RenderThread.h/cpp | frameworks/base/libs/hwui/renderthread/RenderThread.h |
| RenderThread | RenderProxy.h/cpp | frameworks/base/libs/hwui/renderthread/RenderProxy.h |
| RenderThread | CanvasContext.h/cpp | frameworks/base/libs/hwui/renderthread/CanvasContext.h |
| RenderThread | DrawFrameTask.h/cpp | frameworks/base/libs/hwui/renderthread/DrawFrameTask.h |
| RenderThread | SkiaRecordingCanvas.h/cpp | frameworks/base/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h |
| RenderThread | SkiaPipeline.h/cpp | frameworks/base/libs/hwui/pipeline/skia/SkiaPipeline.h |
| RenderThread | SkiaOpenGLPipeline.cpp | frameworks/base/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp |
| RenderThread | SkiaGpuPipeline.cpp | frameworks/base/libs/hwui/pipeline/skia/SkiaGpuPipeline.cpp |
| SurfaceFlinger | SurfaceFlingerEx.cpp | frameworks/Emui/native/services/surfaceflinger/SurfaceFlingerEx.cpp |
| SurfaceFlinger | AGPRenderEngine.cpp | frameworks/Emui/native/services/surfaceflinger/AGPRenderEngine.cpp |
渲染流水线总览
scss
┌─────────────────────────────────────────────────────────────────┐
│ 应用层 (UI Thread) │
│ ViewRootImpl.performTraversals() │
│ ├── performMeasure() ── 测量阶段 │
│ ├── performLayout() ── 布局阶段 │
│ └── performDraw() ── 绘制阶段 │
│ └── ThreadedRenderer.draw() │
│ ├── updateRootDisplayList() ── 构建 DisplayList │
│ └── syncAndDrawFrame() ── 提交到 RenderThread │
├─────────────────────────────────────────────────────────────────┤
│ RenderThread (渲染线程) │
│ DrawFrameTask.run() │
│ ├── syncFrameState() ── 同步 DisplayList 状态 │
│ │ └── CanvasContext.prepareTree() │
│ └── CanvasContext.draw() ── 执行渲染 │
│ └── SkiaOpenGLPipeline.draw() │
│ ├── 绑定 FBO 0 (默认帧缓冲) │
│ ├── renderFrame() ── 遍历 RenderNode 树并绘制 │
│ ├── FlushAndSubmit() ── 提交 GPU 命令 │
│ └── swapBuffers() ── eglSwapBuffers │
├─────────────────────────────────────────────────────────────────┤
│ SurfaceFlinger (系统服务进程) │
│ onMessageReceived() │
│ ├── handleMessageTransaction() ── 处理 Layer 事务 │
│ ├── handleMessageInvalidate() ── 处理无效区域 │
│ └── doComposition() ── 执行合成 │
│ ├── 策略决策: Device / Client / Sideband │
│ ├── Client 合成: GLES Composition │
│ └── HWC 调用: setLayerBuffer / setLayerCompositionType │
├─────────────────────────────────────────────────────────────────┤
│ Hardware Composer (HAL 层) │
│ HWC2::Device::present() │
│ ├── 硬件叠层 (Overlay) 合成 │
│ ├── PresentFence 同步 │
│ └── Display 刷新输出 │
└─────────────────────────────────────────────────────────────────┘
缓冲区流转机制
markdown
GraphicBuffer 生命周期:
App 进程 SurfaceFlinger 进程 HWC / Display
┌──────────┐ dequeueBuffer ┌──────────────┐ ┌──────────┐
│ Render │ ──────────────────> │ BufferQueue │ │ Hardware │
│ Thread │ │ (生产者- │ │ Composer │
│ │ queueBuffer │ 消费者模型) │ │ │
│ 产出 │ ──────────────────> │ │ acquireBuffer │ │
│ Graphic │ │ Layer │ ──────────────> │ 合成 │
│ Buffer │ │ (Consumer) │ │ 输出 │
└──────────┘ └──────────────┘ └──────────┘
│ │
releaseBuffer PresentFence
│ │
└──────────────────────────────┘