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
                                        │                              │
                                        └──────────────────────────────┘
相关推荐
韩曙亮6 小时前
【Flutter】Flutter 中的 Android / iOS 特殊配置 ① ( 网络权限配置 | HTTP 明文传输配置 | 应用名称配置 )
android·网络·flutter·http·ios·网络权限
_李小白6 小时前
【android opencv学习笔记】Day 31:提取轮廓之Canny算法
android·opencv·学习
hashiqimiya7 小时前
每日android布局xml文件
android·xml·gitee
m0_738120727 小时前
渗透测试基础——PHP 序列化数据结构与反序列化机制详解
android·服务器·网络·数据结构·安全·php
故渊at8 小时前
第二板块:Android 四大组件标准化学理 | 第十一篇:组件间通信(IPC)与 Binder 深度解析
android·binder·组件化·组件间通信
ZC跨境爬虫8 小时前
跟着 MDN 学JavaScript day_10:数组——数据的有序集合
android·java·开发语言·前端·javascript
消失的旧时光-19439 小时前
Kotlin 协程设计思想(九):Flow 到底是什么?为什么 suspend 函数还需要 Flow?
android·kotlin·协程·协程异常
消失的旧时光-19439 小时前
Kotlin 协程设计思想(八):suspend 到底是什么?为什么 suspend 不是开启协程?
android·kotlin·suspend·continuation
weiggle9 小时前
第六篇:状态管理——从 mutableStateOf 到 StateFlow
android