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
                                        │                              │
                                        └──────────────────────────────┘
相关推荐
杉氧1 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
Kapaseker6 小时前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋7 小时前
Android 现代架构不需要事件总线进阶篇
android
杉氧1 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏1 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧1 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄1 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭1 天前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景1 天前
Kotlin Flow操作符学习
android·kotlin
plainGeekDev1 天前
GreenDAO → Room
android·java·kotlin