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
                                        │                              │
                                        └──────────────────────────────┘
相关推荐
流年如夢9 小时前
类和对象(上)
android·java·开发语言
用户86022504674729 小时前
从入门到进阶的 React Native 实战指南
android·前端
沐言人生9 小时前
ReactNative 源码分析10——Native View创建流程createView
android·react native
问心无愧05139 小时前
ctf show web入门98
android·前端·笔记
李斯维9 小时前
Jetpack 生命周期组件 Lifecycle 的设计思想和使用
android·android studio·android jetpack
Mr YiRan10 小时前
Android构建优化:基于Git Diff+TaskGraph
android·git·elasticsearch
赏金术士10 小时前
第二章:Compose入门—声明式UI编程
android·ui·kotlin·compose
星间都市山脉10 小时前
Android 谷歌 VTS 完整测试
android
齊家治國平天下10 小时前
Android 14 AIDL HAL 使用指南-获取服务流程解析
android·hal·aidl·servicemanager·aidl hal·获取服务