SurfaceControl及SurfaceFlinger中的Layer创建过程深入剖析

Android13 SurfaceControl创建流程分析 SurfaceControl是Android系统中的一个类,用于管理和控制Surface的创建、显示和销毁,SurfaceControl的创建过程如下:下面分析WindowManagerService创建SurfaceControl的步骤:首先应用进程会new一个java层SurfaceControl,什么都没做,然后传递到WMS进程,因为SurfaceControl在AIDL中是out类型,所以在WMS进程赋值。 阅读详情
AI摘要

本文详细解释了如何在Android框架中创建SurfaceComposerClient对象,以及它与SurfaceSession、SurfaceFlinger和ComposerService之间的交互过程,涉及跨进程连接和Layer创建的细节。

SurfaceComposerClient创建

SurfaceComposerClient对象是在哪里创建的呢?是在SurfaceSession构造时候创建
frameworks/base/core/jni/android_view_SurfaceSession.cpp

static jlong nativeCreate(JNIEnv* env, jclass clazz) {
    SurfaceComposerClient* client = new SurfaceComposerClient();
    client->incStrong((void*)nativeCreate);
    return reinterpret_cast<jlong>(client);
}

这里的SurfaceSession是在哪里创建的呢?这里直接上堆栈

在这里插入图片描述
实际是在ViewRootImpl构造期间就创建
在这里插入图片描述这个是纯app ViewRootImpl角度构造情况,但是更多其实是在WMS中会创建对应SurfaceSession

12-20 15:34:27.090   573  1477 I lsm888888: new SurfaceSession android.view.SurfaceSession@2284788
12-20 15:34:27.090   573  1477 I lsm888888: java.lang.Exception
12-20 15:34:27.090   573  1477 I lsm888888: 	at android.view.SurfaceSession.<init>(SurfaceSession.java:40)
12-20 15:34:27.090   573  1477 I lsm888888: 	at com.android.server.wm.Session.onWindowAdded(Session.java:773)
12-20 15:34:27.090   573  1477 I lsm888888: 	at com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:1821)
12-20 15:34:27.090   573  1477 I lsm888888: 	at com.android.server.wm.Session.addToDisplayAsUser(Session.java:257)
12-20 15:34:27.090   573  1477 I lsm888888: 	at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:640)
12-20 15:34:27.090   573  1477 I lsm888888: 	at com.android.server.wm.Session.onTransact(Session.java:206)
12-20 15:34:27.090   573  1477 I lsm888888: 	at android.os.Binder.execTransactInternal(Binder.java:1500)
12-20 15:34:27.090   573  1477 I lsm888888: 	at android.os.Binder.execTransact(Binder.java:1444)

可以看出在addWindow后会调用Session.onWindowAdded让创建SurfaceSession,后续用这个SurfaceSession创建对应的SurfaceControl图层

在这里插入图片描述

SurfaceComposerClient的mClient初始化

这里的mClient是谁呢?类型是
sp mClient;
看得出是一个接口

看下SurfaceComposerClient构造时候会与sf进行跨进程createConnection创建链接,返回的对象就是Client对象。

void SurfaceComposerClient::onFirstRef() {
    sp<ISurfaceComposer> sf(ComposerService::getComposerService());
    if (sf != nullptr && mStatus == NO_INIT) {
        sp<ISurfaceComposerClient> conn;
        conn = sf->createConnection();
        if (conn != nullptr) {
            mClient = conn;
            mStatus = NO_ERROR;
        }
    }
}

这里又出现了ComposerService::getComposerService()
frameworks/native/libs/gui/SurfaceComposerClient.cpp

sp<ISurfaceComposer> ComposerService::getComposerService() {
    ComposerService& instance = ComposerService::getInstance();
    if (instance.mComposerService == nullptr) {
        if (ComposerService::getInstance().connectLocked()) {
            WindowInfosListenerReporter::getInstance()->reconnect(instance.mComposerService);
        }
    }
    return instance.mComposerService;
}
//connectLocked实现
bool ComposerService::connectLocked() {
    const String16 name("SurfaceFlinger");
    //就是获取sf的bp代理,赋值给mComposerService
    mComposerService = waitForService<ISurfaceComposer>(name);
    return true;
}

所以上面onFirstRef中sf->createConnection()调用到sf了,sf代码如下
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
    const sp<Client> client = new Client(this);
    return client->initCheck() == NO_ERROR ? client : nullptr;
}

sf端就是简单创建了一个Client对象,这里来看看
其实Client本质是一个Binder对象的BpBinder即跨进程的代理,远端的BnBinder在SurfaceFlinger的Client.cpp
思考为啥有了sf代理,还需要Client:
哈哈,其实这里主要是为了帮助sf进行解耦一部分工作

SurfaceControl,Layer创建

frameworks/base/core/jni/android_view_SurfaceControl.cpp

static jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj,
        jstring nameStr, jint w, jint h, jint format, jint flags, jlong parentObject,
        jobject metadataParcel) {
    sp<SurfaceComposerClient> client;
  
    status_t err = client->createSurfaceChecked(String8(name.c_str()), w, h, format, &surface,
                                                flags, parentHandle, std::move(metadata));
  
    surface->incStrong((void *)nativeCreate);
    return reinterpret_cast<jlong>(surface.get());
}

主要调用到了SurfaceComposerClient的createSurfaceChecked。

下面看看 SurfaceComposerClient::createSurfaceChecked方法


status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32_t w, uint32_t h,
                                                     PixelFormat format,
                                                     sp<SurfaceControl>* outSurface, uint32_t flags,
                                                     const sp<IBinder>& parentHandle,
                                                     LayerMetadata metadata,
                                                     uint32_t* outTransformHint) {
 
        err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),
                                     &handle, &gbp, &id, &transformHint);
    } 
        if (err == NO_ERROR) {
            *outSurface =
                    new SurfaceControl(this, handle, gbp, id, w, h, format, transformHint, flags);
        }
    return err;
}

最后会调用到Client的createSurface
frameworks/native/services/surfaceflinger/Client.cpp

status_t Client::createSurface(const String8& name, uint32_t /* w */, uint32_t /* h */,
                               PixelFormat /* format */, uint32_t flags,
                               const sp<IBinder>& parentHandle, LayerMetadata metadata,
                               sp<IBinder>* outHandle, sp<IGraphicBufferProducer>* /* gbp */,
                               int32_t* outLayerId, uint32_t* outTransformHint) {
    // We rely on createLayer to check permissions.
    LayerCreationArgs args(mFlinger.get(), this, name.c_str(), flags, std::move(metadata));
    return mFlinger->createLayer(args, outHandle, parentHandle, outLayerId, nullptr,
                                 outTransformHint);
}

接下来就是跨进程到了Sf端


status_t SurfaceFlinger::createLayer(LayerCreationArgs& args, sp<IBinder>* outHandle,
                                     const sp<IBinder>& parentHandle, int32_t* outLayerId,
                                     const sp<Layer>& parentLayer, uint32_t* outTransformHint) {
  
    sp<Layer> layer;
	//根据不同的flags创建不同的Layer,常见情况:有buffer数据的一般是createBufferStateLayer,没有buffer的就是createContainerLayer
    switch (args.flags & ISurfaceComposerClient::eFXSurfaceMask) {
        case ISurfaceComposerClient::eFXSurfaceBufferQueue:
        case ISurfaceComposerClient::eFXSurfaceBufferState: {
            result = createBufferStateLayer(args, outHandle, &layer);
            std::atomic<int32_t>* pendingBufferCounter = layer->getPendingBufferCounter();
            if (pendingBufferCounter) {
                std::string counterName = layer->getPendingBufferCounterName();
                mBufferCountTracker.add((*outHandle)->localBinder(), counterName,
                                        pendingBufferCounter);
            }
        } break;
        case ISurfaceComposerClient::eFXSurfaceEffect:
            result = createEffectLayer(args, outHandle, &layer);
            break;
        case ISurfaceComposerClient::eFXSurfaceContainer:
            result = createContainerLayer(args, outHandle, &layer);
            break;
        default:
            result = BAD_VALUE;
            break;
    }
    int parentId = -1;
    sp<Layer> parentSp = parent.promote();
    if (parentSp != nullptr) {
        parentId = parentSp->getSequence();
    }
    //调用到addClientLayer方法
    result = addClientLayer(args.client, *outHandle, layer, parent, addToRoot, outTransformHint);
    if (result != NO_ERROR) {
        return result;
    }

    *outLayerId = layer->sequence;
    return result;
}

status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBinder>& handle,
                                        const sp<Layer>& layer, const wp<Layer>& parent,
                                        bool addToRoot, uint32_t* outTransformHint) {


    {
     //放入到mCreatedLayers集合中
        std::scoped_lock<std::mutex> lock(mCreatedLayersLock);
        mCreatedLayers.emplace_back(layer, parent, addToRoot);
    }

    if (client != nullptr) {
    /client与layer会进行绑定
        client->attachLayer(handle, layer);
    }
//设置事物flag
    setTransactionFlags(eTransactionNeeded);
    return NO_ERROR;
}

简单总结图:
在这里插入图片描述

更多framework干货请关注“千里马学框架”

Android6.0 SurfaceControl分析(一)SurfaceControl创建&使用 Surface创建&使用 一、SurfaceControl的创建 SurfaceControl的创建是在ViewRootImpl中调用requestLayout,最后到WMS的relayoutWindow函数创建SurfaceControl对象。是通过WindowState的WindowStateAnimator对象调用createSurfaceLocked对象创建的。最后再通过outSurface传给ViewRootI 阅读详情

相关推荐

Android6.0 SurfaceControl分析(二)SurfaceControl和SurfaceFlinger通信

上篇博客我们说到SurfaceControl会调用openTransaction和closeTransaction来一起讲所有SurfaceControl的属性等传给SurfaceFlinger。我们来看下这个过程。 一、SurfaceControl 我们先来看下SurfaceControl.java中的相关函数,都是调用了JNI函数。 public static void open

kc58236582的博客 8945

Android S:SurfaceFlinger之SurfaceControl.java的用途

Handle to an on-screen Surface managed by the system compositor. SurfaceControl是一个句柄,该句柄是指向由系统合成器管理的屏幕上Surface。 The SurfaceControl is a combination of a buffer source, and metadata about how to display the buffers. SurfaceControl是缓冲区源和有关如何显示缓冲区的元数据的组合。 By

月山知了的博客 4241

09 SurfaceFinger layer创建过程

本篇讲述了app创建Surface时SurfaceFlinger主要做哪些工作

fengchaochao123的博客 1363

SurfaceControl之Transaction事物深入剖析-android framework实战开发

layer_state_t结构体用来代表Layer图层的的相关信息,SurfaceControl与sf的Layer共用这个layer_state_t结构体,layer_state_t包括layer所有属性主要成员如下:可以看到常见的主要属性:坐标,长宽,变换矩阵,变化值what,flags,mask等,一般是一个图层就有一个layer_state_t结构体。

learnframework的博客 5729

SurfaceFlinger学习之路(二)Surface的创建

介绍了View的绘制流程,最后讲到了WMS与SurfaceSession、Surface之间关系。

三木仔 1545

Android 图形架构 之五—— 深入分析addView所发生的的一切

前言 前几篇文章,分析了在SurfaceFlinger 进程,WMS进程 中,图形架构的流程和关键类的介绍。现在我们来分析一下,app进程中是如何与这些进程进行交互,以及何时交互。 Android 图形架构 之一 ——概述 Android 图形架构 之二—— SurfaceFlinger 启动和连接 Android 图形架构 之三—— 创建Layer、Surface、SurfaceControl Android 图形架构 之四——图形缓冲区的申请和消费流程及核心类 Android 图形架构 之五——深入分析

薛瑄的博客 4401

AndroidQ 图形系统(1)Surface与SurfaceControl创建分析

本篇文章分析Surface和SurfaceControl的创建流程,在window通过addView添加到WMS时会创建ViewRootImpl,ViewRootImpl创建好之后Surface,SurfaceControl都作为全局变量被new了出来,但是仅仅是调用了它们无参构造函数创建了一个对象,其他什么也没做,那它们具体初始化在什么地方呢? ViewRootImpl的setView()方法中会调用requestLayout()准备进行View的测量,布局和绘制,即在收到下一个Vsync时执行perfo

qq_34211365的博客 1万+

Android 图形架构 之三—— 创建Layer、Surface、SurfaceControl

前言 上一篇我们分析了,app与SurfaceFlinger建立连接的过程,现在我们就可以继续往下分析,看下创建Surface的过程。 我们可以将Surface理解为一个绘图表面,Android应用程序负责往这个绘图表面上填内容,而SurfaceFlinger服务负责将这个绘图表面的内容取出来,并且渲染在显示屏上。 概述 在Android中,Window与Surface一一对应。 如果说Window关心的是层次和布局,是从设计者角度定义的类,Surface则从实现角度出发,是工程师关系和考虑的类。Windo

薛瑄的博客 1万+

SurfaceFlinger中Layer的创建 - 安卓R

1

SSSxCCC的博客 3070

从零开始:HLW8110电能计量IC的硬件设计与软件调试全攻略

本文详细介绍了HLW8110电能计量IC的硬件设计与软件调试全流程,涵盖核心特性、抗干扰设计、UART通信协议及校准方法。通过实战案例和优化技巧,帮助工程师快速掌握高精度交流测量技术,适用于智能插座、充电桩等应用场景。

p5l2m9n4o6q的博客 576

SpringBoot Redis入门(一)——redis、Lettuce、Redisson使用

Lettuce是SpringBoot自带的Redis客户端,性能比Redis要好, 是线程安全的,支持同步编程,异步编程,响应式编程,自动重新连接,主从模式,集群模块,哨兵模式Redisson 是一个在 Redis 的功能基础上实现的 Java 驻内存数据网格客户端。实现了分布式和可扩展的 Java 数据结构,提供很多分布式相关操作服务,例如分布式锁,分布式集合,可通过 Redis 支持延迟队列。

朗朗的博客 3833

SurfaceControl 构建过程分析

远程调用获取显示配置信息App 向 SF 发起远程调用,SF 中创建一个 Layer 对象,App 中创建一个 SurfaceControl 对象,SurfaceControl 对象中有一个 mHandle 成员,该成员可以索引到 Layer 对象远程调用,配置 Layer。

Damon_X的博客 1138

吉林大学2016级唐班c语言期末考试B卷

` #include<stdio.h> #include<stdlib.h> //双指针法,每次从a,b中选一个最大的数,从后向前一次放在数组a中 int merge(int *a,int m,int *b,int n){ int i=m-1,j=n-1,k=m+n-1; while(i>=0&&j>=0){ if(a[i]>b[j])a[...

weixin_42339173的博客 1195

SurfaceFlinger SurfaceContol(二) SurfaceControl

上一篇讲了SurfaceComposerClient,本篇介绍SurfaceControl。

Rainman博的专栏 903

华北理工大学以升实验班蓝桥杯选拔赛题解

文章目录华北理工大学以升实验班蓝桥杯选拔赛题解A:期末考试题目描述题目讲解代码B:月份题目描述题目讲解代码C:打饭题目描述题目讲解代码D : 正弦波信号题目描述题目讲解代码E : 亲爱的长方形题目描述题目讲解代码F:挖金子题目描述题目讲解代码G : 金金的游戏题目描述题目讲解代码H : 区间和题目描述题目讲解代码详细视频讲解请关注华北理工大学b站账号。 华北理工大学以升实验班蓝桥杯选拔赛题解 A:期末考试 题目描述 Description 期末考试过去许多天了,如今成绩都出来了,那么现在让我们对成绩我分个类

Qq1739206233的博客 1128

编译原理实验二:LL(1)分析法(附C/C++完整代码)

本文讲述了LL(1)文法的原理及如何用C语言实现。并在给出的代码中实现了消除文法的左递归,First集,Follow集,select集的输出,构造预测分析表并输出,和对任意输入字符串的分析。程序总流程为:从文件读取文法 -> 输出文法信息 -> 消除左递归并输出消除后的文法 -> 计算First集并输出 -> 计算Follow集并输出 ->计算select集并输出 -> 判断是否是LL(1)文法 -> 构造预测分析表并输出 ->手动输入要分析的字符串 -> 输出分析过程和结果读取文件。

W_Wmwmwm的博客 6192

SurfaceFlinger中Layer的修改 - 安卓R

1

SSSxCCC的博客 5429

励磁电感 Lm 选对了,LLC 才真“高效”:半桥 LLC 效率优化

你有没有遇到过这种 LLC:参数一套下来,ZVS 也有了,波形看着也“挺谐振”,但一上功率——,效率就是死活上不去。我说句直白的:LLC 的“高效”,很大一部分其实是在背后控场。Lm 选小了,励磁电流蹭蹭涨,谐振电流 RMS 变大,导通损耗、开关损耗、整流损耗一起上天;Lm 选太大,又可能把 ZVS 的门槛抬高,轻载掉 ZVS,EMI 也开始作妖。

weixin_43199439的博客 436

Android T(13) 源码分析 — 原生层 SurfaceControl 的创建

在 Android 系统中,Surface 是用于图形渲染的一个重要组件,它提供了一个可以绘制图形的缓冲区。Surface 涉及到SurfaceControl, BufferQueue, Buffer Alloc,layer 等多个模块,本文主要介绍一下SurfaceControl 的创建和管理。SurfaceControl 涉及到多个层次的代码,包括 Java 层、JNI 层和原生层。本篇文章基于Android T(13)的源码,分析原生层的 SurfaceControl 创建过程。

qq_39941677的博客 2473

零基础基于U-Net网络实战眼底图像血管提取

文章目录1 前言2 血管提取任务概述3 U-Net架构简介4 眼底图像血管分割代码5 结果评估可视化(ROC曲线)6 改进U-Net网络完成眼底图像血管提取任务思路 1 前言 本文基于U-Net架构完成了视网膜血管的提取任务,基于Keras框架更简单的实现分割,网络、工具类、训练和预测的代码一目了然

NJU phd 在读。 5203

【系统分析师】2025年下半年真题:案例分析-答案及详解(回忆版)

Redis相比Memcached在电商高并发场景下具有显著优势:支持持久化(RDB/AOF)、丰富数据结构(如有序集合实现排行榜)、原生支持集群和哨兵模式(高可用性)。布隆过滤器通过位数组和哈希函数预先存储所有合法订单ID,当查询请求到达时快速拦截无效ID(如伪造ID),避免其穿透缓存直接冲击数据库,从而预防缓存击穿问题。

数据知道的博客 5986

SurfaceFinger layer创建过程

SurfaceFlinger::setTransactionState中比较复杂容易忽略将TransactionState state放入mTransactionQueue的过程,mTransactionQueue在后面创建hwc layer的时候会用到。mClient->createSurface会调用到android12\frameworks\native\services\surfaceflinger\Client.cpp 中Client::createSurface。app端创建Surface。

IT先森 1712

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SurfaceFlinger和端侧的大体框架(2)

这篇博客会带大家探究app和WMS是怎么通过binder和SurfaceFlinger进行通信,主要围绕如何基于Binder去创建一个Surface来展开。Binder是一个Android用于跨进程通信的方案,在Android中使用非常多,后面会专门写一个关于Binder专题,在阅读这篇文章之前,只要知道java和c++分别是怎么使用binder的就可以了。

起司锅仔的博客 2317

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android 图形系统之三:SurfaceControl

在 Android 系统中,SurfaceControl 是一个关键的类,用于管理应用窗口和屏幕上的显示内容。它与 SurfaceFlinger 紧密交互,通过 BufferQueue 提供高效的图形缓冲区管理能力。

执剑人 3950

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android 14 SurfaceFlinger-Layer visibleRegion的计算过程

涉及到的文件:frameworks/native/services/surfaceflinger/layer.hframeworks/native/services/surfaceflinger/layer.cppframeworks/native/libs/ui/Transform.cppframeworks/native/libs/ui/Transform.h SurfaceControl.setPosition -> android_view_SurfaceControl: setPositi

u012627628的博客 1627
上一篇: perfetto/systrace基础知识讲解-千里马android framework实战开发
下一篇: 手机大厂的自由窗口freeform功能基于aosp14/安卓14适配完成-千里马android framework实战开发
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值