Android Surface创建流程
Android Surface 的创建流程涉及应用层、WindowManagerService (WMS) 和 SurfaceFlinger 的协作,核心流程如下:
️ 一、应用进程侧初始化
-
Activity 关联 Surface
每个 Activity 对应一个DecorView
和ViewRootImpl
。在ViewRootImpl
构造函数中会创建 Java 层的Surface
对象(此时无实际缓冲区)。private final Surface mSurface = new Surface(); // 位于 ViewRootImpl
-
触发 Surface 请求
调用ViewRootImpl.setView()
时,通过relayoutWindow()
向 WMS 发起请求,传递SurfaceControl
对象以控制绘图表面属性。mWindowSession.relayout(..., mSurfaceControl, ...); // 跨进程通信至 WMS
⚙️ 二、WMS 与 SurfaceFlinger 协作
-
WMS 创建 SurfaceControl
WMS 为每个窗口(WindowState
)创建SurfaceControl
对象,作为 Native 层SurfaceControl
的封装,用于控制窗口层级、位置等属性。 -
请求 SurfaceFlinger 创建 Layer
WMS 通过SurfaceComposerClient
(关联ISurfaceComposerClient
Binder 接口)请求 SurfaceFlinger 创建Layer
对象(即真正的绘图表面)。Layer
内部关联SharedBufferServer
管理 UI 元数据缓冲区堆栈。- 每个
Layer
对应一个SurfaceLayer
(Binder 对象),用于应用与 SurfaceFlinger 通信。
🔄 三、Surface 跨进程绑定
-
应用侧获取有效 Surface
WMS 将SurfaceControl
的引用传回应用进程。应用侧通过Surface.copyFrom()
绑定 Native 层Surface
,获得操作绘图表面的能力。- 此时
Surface
仍无实际图形缓冲区,需等待绘制触发。
- 此时
-
分配图形缓冲区
首次执行绘制(如Canvas canvas = mSurface.lockCanvas()
)时,触发dequeueBuffer
从BufferQueue
申请缓冲区,最终由Layer
的BufferQueueProducer
分配。
💡 关键点说明
- 双 Surface 对象:应用进程与 WMS 各有一个 Java 层
Surface
,但对应 SurfaceFlinger 的同一个Layer
。 - SurfaceControl 作用:管理
Layer
的生命周期和属性(如 Z-order、透明度),而非直接参与绘制。 - 虚拟 Surface:通过
SurfaceView
或VirtualDisplay
创建时,流程类似但需实现SurfaceHolder.Callback
监听生命周期。
此流程确保了应用 UI 内容通过
Canvas
绘制到Surface
,最终由 SurfaceFlinger 合成并显示。
引用链接:
1.【Android】WMS(六)Surface的创建和操作 - CSDN博客
2.Android应用程序窗口(Activity)的绘图表面(Surface)的创建流程 - CSDN博客
3.Android应用程序请求SurfaceFlinger服务创建Surface的过程分析 - 看云
4.Android 创建虚拟屏 surface - 51CTO博客
5.android activity新建surface - 51CTO博客
6.Android Surface创建流程 - CSDN
7.設定Surface 雙核處理器技術 - 微软
8.Android SurfaceFlinger 学习之路(六)----SurfaceFlinger创建Surface - CSDN
9.android6.0 Activity(四) Surface创建 - 博客园
10.android的surfaceflinger原理学习「建议收藏」 - 腾讯云
11.Android13 Surface创建流程分析_android surfacecontrol-CSDN博客 - CSDN博客
12.android自定义surfaceview设置边框 android surface创建 - 51CTO博客
13.Android Surface 创建详解-CSDN博客 - CSDN博客
14.Android Surface 分析+源码 - 程序猿的码烦
15.Android 图形显示系统(五) 上层Client和SurfaceFlinger的交互 - 夕月风
16.开发步骤 - 华为开发者联盟
17.flutter架构 flutter源码 LayerTree Impeller源码 Skia DisplayList Op Entity Contents Raster TaskRunner Vsync - 化凡
18.Android Graphics:Vulkan(5)创建交换链 - 凌风
19.Android 14 HWUI 源码研究 View Canvas RenderThread ViewRootImpl skia - 化凡
20.Android Window 管理机制 - Chunyu.J