Android 图形渲染流水线完整架构与执行流程分析

概述

本文档基于当前工程中的 AOSP 源码,系统地阐述 Android 图形渲染流水线的完整架构与执行流程。按照数据流向,将渲染流水线划分为四个阶段进行深入解析:

  1. 应用层视图绘制阶段 --- UI 线程上的 View 树遍历与 DisplayList 构建

  2. RenderThread 渲染处理阶段 --- 异步渲染管线与 GraphicBuffer 产出

  3. SurfaceFlinger 图层合成阶段 --- 图层管理与合成策略决策

  4. 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
                                        │                              │
                                        └──────────────────────────────┘
相关推荐
wxson72828 小时前
【Android视频监控系统技术总结】
android·音视频
hunterandroid10 小时前
[Android 从零到一] LiveData 粘性事件与单次消费:从重复触发到可靠事件总线
android
hunterandroid10 小时前
[Android 从零到一] Android 事件分发机制:从 ACTION_DOWN 到 View 事件消费链路
android
阿巴斯甜10 小时前
adb‑shell 全套命令实操总结
android
奔跑的架构师11 小时前
[A-49]ARMv9/v8-PSCI接口规范与工作流程简介
android·linux·arm开发·arm
AFinalStone12 小时前
Android 7系统国际化(七)Resources 与 AssetManager 源码剖析
android·国际化·local
Android-Flutter12 小时前
Android 内存泄漏详解
android·kotlin
catchadmin12 小时前
Fiber 与 PHP 8.6 Polling API 异步初探
android·开发语言·php
Android-Flutter13 小时前
android Handler , Looper , Message , MessageQueue 详解
android·kotlin