当前位置: 首页 > web >正文

Android Surface创建流程

Android Surface 的创建流程涉及应用层、WindowManagerService (WMS) 和 SurfaceFlinger 的协作,核心流程如下:

一、应用进程侧初始化

  1. Activity 关联 Surface
    每个 Activity 对应一个 DecorViewViewRootImpl。在 ViewRootImpl 构造函数中会创建 Java 层的 Surface 对象(此时无实际缓冲区)。

    private final Surface mSurface = new Surface(); // 位于 ViewRootImpl
    
  2. 触发 Surface 请求
    调用 ViewRootImpl.setView() 时,通过 relayoutWindow() 向 WMS 发起请求,传递 SurfaceControl 对象以控制绘图表面属性。

    mWindowSession.relayout(..., mSurfaceControl, ...); // 跨进程通信至 WMS
    

⚙️ 二、WMS 与 SurfaceFlinger 协作

  1. WMS 创建 SurfaceControl
    WMS 为每个窗口(WindowState)创建 SurfaceControl 对象,作为 Native 层 SurfaceControl 的封装,用于控制窗口层级、位置等属性。

  2. 请求 SurfaceFlinger 创建 Layer
    WMS 通过 SurfaceComposerClient(关联 ISurfaceComposerClient Binder 接口)请求 SurfaceFlinger 创建 Layer 对象(即真正的绘图表面)。

    • Layer 内部关联 SharedBufferServer 管理 UI 元数据缓冲区堆栈。
    • 每个 Layer 对应一个 SurfaceLayer(Binder 对象),用于应用与 SurfaceFlinger 通信。

🔄 三、Surface 跨进程绑定

  1. 应用侧获取有效 Surface
    WMS 将 SurfaceControl 的引用传回应用进程。应用侧通过 Surface.copyFrom() 绑定 Native 层 Surface,获得操作绘图表面的能力。

    • 此时 Surface 仍无实际图形缓冲区,需等待绘制触发。
  2. 分配图形缓冲区
    首次执行绘制(如 Canvas canvas = mSurface.lockCanvas())时,触发 dequeueBufferBufferQueue 申请缓冲区,最终由 LayerBufferQueueProducer 分配。

1. new Surface
2. relayoutWindow
3. 创建 SurfaceControl
4. 创建 Layer
5. 返回 SurfaceControl
6. 绑定 Surface
7. lockCanvas
应用进程
ViewRootImpl
WMS
SurfaceFlinger
分配 BufferQueue

💡 关键点说明

  • 双 Surface 对象:应用进程与 WMS 各有一个 Java 层 Surface,但对应 SurfaceFlinger 的同一个 Layer
  • SurfaceControl 作用:管理 Layer 的生命周期和属性(如 Z-order、透明度),而非直接参与绘制。
  • 虚拟 Surface:通过 SurfaceViewVirtualDisplay 创建时,流程类似但需实现 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

http://www.xdnf.cn/news/16140.html

相关文章:

  • CSS自适应布局实战指南
  • Selenium+Java 自动化测试入门到实践:从环境搭建到元素操作
  • TIM定时中断
  • 一些Avalonia与WPF内容的对应关系和不同用法
  • Java从入门到精通!第十一天(Java常见的数据结构)
  • 数据库设计mysql篇
  • 嵌入式学习-土堆目标检测(3)-day27
  • 【iOS】SideTable
  • 【深度解析】从AWS re_Invent 2025看云原生技术发展趋势
  • C语言(20250722)
  • 网络编程---TCP协议
  • 跨越语言壁垒!ZKmall开源商城多语言架构如何支撑电商全球化布局
  • libgmp库(GNU高精度算术库)介绍
  • mac实现sudo命切换node版本
  • netty的编解码器,以及内置的编解码器
  • OpenCV 零基础到项目实战 | DAY 1:图像基础与核心操作
  • LLC协议
  • mysql_innodb_cluster_metadata源数据库
  • Vue3 面试题及详细答案120道(31-45 )
  • Web3面试题
  • 智慧能源合同解决方案
  • 【接口自动化】pytest的基本使用
  • XML高效处理类 - 专为Office文档XML处理优化
  • Aspose.Cells 应用案例:法国能源企业实现能源数据报告Excel自动化
  • Python通关秘籍(五)数据结构——元组
  • Rocky Linux 9 快速安装 Node.js
  • 3.5 模块化编程实践
  • 【数据结构初阶】--栈和队列(二)
  • Python之格式化Conda中生成的requirements.txt
  • 我的第一个开源项目 -- 实时语音识别工具