SurfaceControl及SurfaceFlinger中的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干货请关注“千里马学框架”

<think>好的,我现在需要帮助用户了解如何在Android系统创建SurfaceControl,特别是涉及系统图形组件的部分。首先,我得回忆一下SurfaceControl的作用和相关知识。 SurfaceControlAndroid图形系统中的关键类,用于管理Surface的创建和属性设置。根据用户提供的引用[1],SurfaceControl创建是通过Builder模式进行的。在Java层,SurfaceControl.Builder的build()方法会调用构造函数来生成实例。那构造函数参数包括会话、名称、尺寸、格式、标志、父级等,这些参数需要正确设置才能创建有效的SurfaceControl对象。 接下来,用户可能想知道具体的步骤和注意事项。我需要分步骤说明,从Builder的初始化到参数的配置,再到构建实例的过程。同时,引用[2]提到SurfaceFlinger与图形组件的交互,可能需要简要说明SurfaceControl在整个图形架构中的位置,比如与SurfaceFlinger的关系。 要注意用户的问题是关于创建方法以及系统图形组件,所以需要结合代码示例和架构说明。代码部分需要展示Java层的Builder使用,如new SurfaceControl.Builder(session)并设置各种参数,然后调用build()。同时,要提到系统权限的问题,因为创建SurfaceControl通常需要系统级权限,普通应用可能无法直接使用。 另外,用户可能对SurfaceControl的作用和应用场景感兴趣,比如在窗口管理或SurfaceView中的应用。需要解释它在图形合成过程中的角色,比如如何通过SurfaceControlSurfaceFlinger通信,管理图层的属性如位置、透明度等。 还要考虑相关问题的生成,比如创建所需的权限、参数配置的影响、与Surface的关系,以及常见的错误处理。这些问题可以帮助用户更深入地理解SurfaceControl的使用和调试。 最后,确保回答符合格式要求,使用中文,正确应用LaTeX格式(虽然这里可能用不上数学公式,但要注意其他技术术语的格式),结构清晰,分步骤说明,并引用提供的资料。同时,检查是否有遗漏的关键点,比如SurfaceSession的作用,或者与其他系统组件如WindowManager的交互。</think>### SurfaceControl 创建方法及图形组件解析 在 Android 系统图形组件中,`SurfaceControl` 用于管理图形层(Layer)的属性和生命周期,是窗口系统SurfaceFlinger 交互的核心类[^2]。以下是其创建方法的关键步骤: #### 1. **使用 Builder 模式构建** 通过 `SurfaceControl.Builder` 创建实例,需指定会话(`SurfaceSession`)、名称、尺寸、格式等参数: ```java // frameworks/base/core/java/android/view/SurfaceControl.java SurfaceControl surfaceControl = new SurfaceControl.Builder() .setName("MySurface") .setBufferSize(width, height) .setFormat(PixelFormat.RGBA_8888) .build(); ``` **关键参数说明**: - `mSession`: 关联的 `SurfaceSession`(由 `WindowManagerService` 管理),用于跨进程通信。 - `mParent`: 父级 `SurfaceControl`,决定图层层级关系。 - `mFlags`: 控制可见性、安全策略等(如 `HIDDEN`、`SECURE`)。 #### 2. **与 SurfaceFlinger 的交互** `SurfaceControl` 通过 Binder 将创建请求发送给 SurfaceFlinger,由后者分配图形缓冲区并管理合成逻辑[^2]。例如: ```java // SurfaceControl 构造方法中会调用 native 方法 private SurfaceControl(SurfaceSession session, String name, int width, int height, int format, int flags, SurfaceControl parent, Parcel metadata) { mNativeObject = nativeCreate(session, name, width, height, format, flags, parent != null ? parent.mNativeObject : 0, metadata); } ``` 此处 `nativeCreate()` 最终调用 `SurfaceFlinger::createLayer()` 完成底层创建。 #### 3. **系统权限与调用限制** - **系统级权限**:普通应用无法直接创建 `SurfaceControl`,需系统签名或 `SYSTEM_UID`。 - **跨进程通信**:`SurfaceSession` 封装了与 SurfaceFlinger 的 IPC 连接,确保安全通信[^1]。 #### 4. **与 Surface 的关系** `SurfaceControl` 生成后,可通过 `getSurface()` 获取关联的 `Surface` 对象,用于绘制内容: ```java Surface surface = surfaceControl.getSurface(); Canvas canvas = surface.lockCanvas(null); // 绘制操作 surface.unlockCanvasAndPost(canvas); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值