Surface系统-3-SurfaceControl的创建(native层)

534 阅读8分钟

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。

                        -- 服装学院的IT男

Surface系统-1-应用与SurfaceFlinger建立链接

Surface系统-2-SurfaceControl的创建(java层)

Surface系统-3-SurfaceControl的创建(native层)

Surface系统-4-BLASTBufferQueue和Surface的创建

Surface系统-5-BLASTBufferQueue工作流程概览

本篇同时已收录于Activity短暂的一生系列

正文

之前留下3个问题:

    1. SurfaceControl 对应的 native 创建逻辑
    1. BLASTBufferQueue 的 native 创建逻辑,和 SurfaceControl 有什么联系
    1. BLASTBufferQueue::nativeGetSurface 获取的 Surface 流程

本篇跟踪第一个问题: native 层的 SurfaceControl 的创建流程

1. SurfaceControl , Layer 的创建主流程

对应的 JNI 文件为 android_view_SurfaceControl.cpp

# 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) {
        ScopedUtfChars name(env, nameStr);
        // SurfaceFlinger的C端
        sp<SurfaceComposerClient> client;
        // 这个就是 SurfaceSession 对应的 SurfaceComposerClient
        if (sessionObj != NULL) {
            // // 重点* 1.  获取到之前创建的client
            client = android_view_SurfaceSession_getClient(env, sessionObj);
        } else {
            client = SurfaceComposerClient::getDefault();
        }
        // 拿到父节点
        SurfaceControl *parent = reinterpret_cast<SurfaceControl*>(parentObject);
        //  定义 SurfaceControl
        sp<SurfaceControl> surface;
        ......
        // 父容器
        sp<IBinder> parentHandle;
        if (parent != nullptr) {
            // 重点* 拿到父容器句柄
            parentHandle = parent->getHandle();
        }
        ......
        // 重点* 创建 Surface 和 SurfaceControl
        status_t err = client->createSurfaceChecked(String8(name.c_str()), w, h, format, &surface,
                                                flags, parentHandle, std::move(metadata));
        ......
        surface->incStrong((void *)nativeCreate);
        // 返回 SurfaceControl 指针给java端
        return reinterpret_cast<jlong>(surface.get());
    }
    1. 这里的 sessionObj 就是 java 层 SurfaceSession 对应的 对应 native 层的一个 SurfaceComposerClient 可以与 SurfaceFlinger 通信
    1. parentHandle 可以理解为是父容器在 native 层的 SurfaceControl
    1. 执行 SurfaceComposerClient::createSurfaceChecked 创建 Surface 和 SurfaceControl

重点在于创建 Surface 和 SurfaceControl 的方法,另外需要注意构建的时候传递了父容器的句柄,表示将当前图层挂载到父容器

# SurfaceComposerClient

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) {
    sp<SurfaceControl> sur;
    status_t err = mStatus;

    if (mStatus == NO_ERROR) {
        // 创建 Surface 的结果
        gui::CreateSurfaceResult result;

        // 1. 创建 Layer
        binder::Status status = mClient->createSurface(std::string(name.string()), flags,
                                                       parentHandle, std::move(metadata), &result);

        ......
        if (err == NO_ERROR) {
            // 2. 创建 SurfaceControl
            *outSurface = new SurfaceControl(this, result.handle, result.layerId,
                                             toString(result.layerName), w, h, format,
                                             result.transformHint, flags);
        }
    }
    ......
    return err;
}

这里分为2步:

    1. 执行 Client::createSurface 创建 Surface (Layer)
    1. 创建一个 SurfaceControl 并赋值

这里出现了一个数据结构 CreateSurfaceResult ,表示创建 Surface (Layer)的结果,定义如下,保存了 Layer 的4个属性,其中比较重要的是 handle 等价于是代表一个创建好的 Layer

# CreateSurfaceResult.aidl
    parcelable CreateSurfaceResult {
        IBinder handle; // layer 的句柄
        int layerId; // layer ID
        String layerName; // 名字
        int transformHint; 
    }

执行的是 Client::createSurface 方法,返回结果也是 CreateSurfaceResult 但是内部却有个 layerId 。这是因为在 native 层其实并没有 Surface 有的就是 Layer 。 createSurface 方法其实最后做的事是 “createLayer”

2. 创建 Layer

继续沿着 Client::createSurface 往下分析。

需要留意参数的传递,特别是最后一个参数 result ,注意后面对几个属性的赋值

# Client.cpp
    binder::Status Client::createSurface(const std::string& name, int32_t flags,
                                        const sp<IBinder>& parent, const gui::LayerMetadata& metadata,
                                        gui::CreateSurfaceResult* outResult) {
        
        // We rely on createLayer to check permissions.
        sp<IBinder> handle;
        // 把参数封装在 LayerCreationArgs 中
        LayerCreationArgs args(mFlinger.get(), sp<Client>::fromExisting(this), name.c_str(),
                            static_cast<uint32_t>(flags), std::move(metadata));
        //  设置父节点
        args.parentHandle = parent;
        // 接着调用 SurfaceFlinger 的 createLayer 函数
        const status_t status = mFlinger->createLayer(args, *outResult);
        return binderStatusFromStatusT(status);
    }

流程终于来到了 SurfaceFlinger ,开始创建 Layer 。

Surface 和 Layer 已经在偷偷的切换了概念了

2.1创建 Layer

# SurfaceFlinger.cpp

    status_t SurfaceFlinger::createLayer(LayerCreationArgs& args, gui::CreateSurfaceResult& outResult) {
        status_t result = NO_ERROR;
        sp<Layer> layer;

        switch (args.flags & ISurfaceComposerClient::eFXSurfaceMask) {
            // 以前这些类型是有区分的,现在都放在一个 case里了
            case ISurfaceComposerClient::eFXSurfaceBufferQueue:
            case ISurfaceComposerClient::eFXSurfaceContainer: // 容器类型
            case ISurfaceComposerClient::eFXSurfaceBufferState:
                args.flags |= ISurfaceComposerClient::eNoColorFill;
                FMT_FALLTHROUGH;
            case ISurfaceComposerClient::eFXSurfaceEffect:  {
                    // 重点*  创建layer(注意第二个参数 handle)
                    // 创建 Layer 并对 CreateSurfaceResult.handle 赋值
                    result = createBufferStateLayer(args, &outResult.handle, &layer);
                    ......
                } break;
            default:
                result = BAD_VALUE;
                break;
        }
        ......
        // 拿到父节点
        sp<Layer> parent = LayerHandle::getLayer(args.parentHandle.promote());
        ......
        // 记录新建的 Layer
        result = addClientLayer(args, outResult.handle, layer, parent, &outTransformHint);
        // CreateSurfaceResult 的剩下3个属性赋值
        outResult.transformHint = static_cast<int32_t>(outTransformHint);
        outResult.layerId = layer->sequence;
        outResult.layerName = String16(layer->getDebugName());
        return result;
    }
# SurfaceFlinger.cpp
    status_t SurfaceFlinger::createBufferStateLayer(LayerCreationArgs& args, sp<IBinder>* handle,
                                                    sp<Layer>* outLayer) {

        // 根据参数创建一个 Layer 赋值给参数                                                   
        *outLayer = getFactory().createBufferStateLayer(args);
        // 给 handle 赋值
        *handle = (*outLayer)->getHandle();
        return NO_ERROR;
    }
    1. 创建 Layer
    1. 对 CreateSurfaceResult.handle 赋值,间接持有 Layer

根据日志确认是在 SurfaceFlingerDefaultFactory.cpp 下执行。(SurfaceFlinger 启动流程里执行 “surfaceflinger::createSurfaceFlinger()”赋值)

# SurfaceFlingerDefaultFactory.cpp
    sp<Layer> DefaultFactory::createBufferStateLayer(const LayerCreationArgs& args) {
        ALOGI("biubiubiu C++ DefaultFactory::createBufferStateLayer");
        // 直接创建 Layer ,以前的版本是创建 BufferStateLayer
        return sp<Layer>::make(args);
    }

2.2 Layer 的 Handle

在 SurfaceFlinger::createBufferStateLayer 方法中还有一个重要的点就是在 SurfaceFlinger 中创建一个 Layer 对应的 Handle 给调用端用于进程通信,这个 Handle 也是一个 Binder 类型。

# Layer.cpp

    sp<IBinder> Layer::getHandle() {
        ......
        mGetHandleCalled = true;
        mHandleAlive = true;
        // 创建一个 LayerHandle ,传递 mFlinger 和 Layer 本身
        return sp<LayerHandle>::make(mFlinger, sp<Layer>::fromExisting(this));
    }

LayerHandle 是 BBinder 子类,用于进程通信,内部持有 SurfaceFlinger 和 Layer 。

后续流程中通过这个 LayerHandle 就能获取到对应的 Layer 了

LayerHandle 的定义如下

# LayerHandle.h
class LayerHandle : public BBinder {
    public:
        ......
        static sp<LayerHandle> fromIBinder(const sp<IBinder>& handle);
        static sp<android::Layer> getLayer(const sp<IBinder>& handle);
        ......

    private:
        sp<android::SurfaceFlinger> mFlinger;
        sp<android::Layer> mLayer;
        const uint32_t mLayerId;
};

2.3 addClientLayer

Layer 创建好后,SurfaceFlinger 这边当然也需要记录这个 Layer 了。

# SurfaceFlinger.cpp
    status_t SurfaceFlinger::addClientLayer(LayerCreationArgs& args, const sp<IBinder>& handle,
                                            const sp<Layer>& layer, const wp<Layer>& parent,
                                            uint32_t* outTransformHint) {
        ......
            // 保存到 mCreatedLayers 中
            mCreatedLayers.emplace_back(layer, parent, args.addToRoot);
        ......
        return NO_ERROR;
    }

2.4 初识 Layer

前面已经分析完 Layer 的创建和 LayerHandle 是什么,现在再简单的了解一下 Layer 这个类的定义。 属性和方法很多,有个概念即可,这边也只是列出一些个人觉得重要的定义。

# Layer.h
    class Layer : public virtual RefBase {
    public:
        // 这4个常量定义的是 dump 的时候 Layer 是不是有焦点的判断,也就是带不带“ * ”
        // 0 和 1都表示有焦点

        // 优先级未设置,通常用于初始化变量或表示未知的优先级
        static constexpr int32_t PRIORITY_UNSET = -1;
        // 表示窗口处于焦点状态并投票选择了首选的模式ID,具有最高优先级
        static constexpr int32_t PRIORITY_FOCUSED_WITH_MODE = 0;
        // 窗口处于焦点状态,但没有请求特定的模式ID,次高优先级
        static constexpr int32_t PRIORITY_FOCUSED_WITHOUT_MODE = 1;
        // 窗口不处于焦点状态,但投票选择了特定的模式ID,优先级最低
        static constexpr int32_t PRIORITY_NOT_FOCUSED_WITH_MODE = 2;

        ......
        // 当前 layer 的状态结构体,数据很多 
        // 有个变量 mDrawingState 就是其对象
        struct State {
            ui::LayerStack layerStack;
            uint32_t flags;
            // 序列号,递增
            int32_t sequence; // changes when visible regions can change
            ......
            // A list of surfaces whose Z-order is interpreted relative to ours.
            SortedVector<wp<Layer>> zOrderRelatives;
            half4 color;
            float cornerRadius;
            ......
        }
    ......
    protected:
        ......
        State mDrawingState;
        ......
    }
# Layer.cpp
    
    // 构造方法
    Layer::Layer(const LayerCreationArgs& args)
        : sequence(args.sequence),
            mFlinger(sp<SurfaceFlinger>::fromExisting(args.flinger)),
            mName(base::StringPrintf("%s#%d", args.name.c_str(), sequence)),
            mClientRef(args.client),
            mWindowType(static_cast<WindowInfo::Type>(
                    args.metadata.getInt32(gui::METADATA_WINDOW_TYPE, 0))),
            mLayerCreationFlags(args.flags),
            mBorderEnabled(false),
            mTextureName(args.textureName),
            mLegacyLayerFE(args.flinger->getFactory().createLayerFE(mName)) {
            ALOGV("Creating Layer %s", getDebugName());
            ......
            // 一堆mDrawingState的初始化
            mDrawingState.flags = layerFlags;
            ......
    }

2.5 Android 14 Layer 概念的区别

这一块的流程在 android 14 还是修改了不少,印象比较深的就是移除了“Buff”和容器类型的 Layer 的区别,之前的代码会根据 flag 创建 BufferStateLayer 或者 ContainerLayer ,现在统一创建的是 Layer ,这点在代码上已经很明显了,另外 dump sf 也能确定。

以前在 Android 13 的版本这里是创建 "return new BufferStateLayer(args)"

# SurfaceFlingerDefaultFactory.cpp
    sp<BufferStateLayer> DefaultFactory::createBufferStateLayer(const LayerCreationArgs& args) {
        // 现在是直接创建 Layer 了
        return new BufferStateLayer(args);
    }

3. 创建 SurfaceControl

SurfaceComposerClient::createSurfaceChecked 方法先触发创建 Layer 后就会使用这个 Layer 创建出一个 SurfaceControl 并返回指针给 java 层。

先来看看 native 层的 SurfaceControl 是怎么定义的。(仅列出部分方法和属性)

# SurfaceControl.h

    class SurfaceControl : public RefBase
    {
    public:
        ......
        bool isValid() {
            return mHandle!=nullptr && mClient!=nullptr;
        }
        // 获取 Surface
        sp<Surface> getSurface();
        // 创建 Surface (内部还是调用getSurface)
        sp<Surface> createSurface();
        // 获取 layer 句柄
        sp<IBinder> getHandle() const;
        // 获取 layer 句柄
        sp<IBinder> getLayerStateHandle() const;
        // 获取对应 layer的ID
        int32_t getLayerId() const;
        const std::string& getName() const;
        ......
        // 获取父节点
        sp<SurfaceControl> getParentingLayer();
        ......
    private:
        ......
        // 应用SurfaceComposerClient 用于与 SF 通信
        sp<SurfaceComposerClient>   mClient;
        // Layer
        sp<IBinder> mHandle;
        ......
        // mSurfaceData
        mutable sp<Surface>    mSurfaceData;
        // BLASTBufferQueue
        mutable sp<BLASTBufferQueue> mBbq;
        // 孩子 SurfaceControl ,目前看到老版本会创建实例
        mutable sp<SurfaceControl> mBbqChild;
        ......
        uint32_t mWidth = 0;
        uint32_t mHeight = 0;
        ......
    }

不是特别严谨的类图表示一下 SurfaceControl

类图-SurfaceControl.png

SurfaceControl 管理着一个 Layer 和一个 Surface ,不过目前还没看到 Surface 的创建。

看一下 SurfaceControl 的构造方法:

# SurfaceControl.cpp

    SurfaceControl::SurfaceControl(const sp<SurfaceComposerClient>& client, const sp<IBinder>& handle,
                                int32_t layerId, const std::string& name, uint32_t w, uint32_t h,
                                PixelFormat format, uint32_t transform, uint32_t flags)
        : mClient(client),
            mHandle(handle), // LayerHandle 
            mLayerId(layerId), // layer 的 ID
            mName(name), // 名字
            mTransformHint(transform),
            mWidth(w), // 宽高
            mHeight(h),
            mFormat(format),
            mCreateFlags(flags) {}

主要就是和新建的 Layer 绑定一下(通过 LayerHandle 和 layerId),毕竟 SurfaceControl 要对应一个 Layer。

4. 小结

创建 Surface 最后其实创建的是 Layer ,以前对这2个概念总拎不清,不知道是一一对应的关系还是一对多的关系,目前可以确定是 一一对应了,只不过在上层用到但是 Surface 在 SurfaceFlinger 是 Layer 。

    1. SurfaceControl 内部持有的是一个 Layer 和一个 Surface
    1. SurfaceComposerClient::createSurfaceChecked 方法中创建的 CreateSurfaceResult 对象在创建 Layer 流程中被赋值,其保存了 Layer 的几个重要属性,特别是通过 handle 变量持有 LayerHandle ,通过这个 LayerHandle 就能获取到对应的 Layer 对象

完整的调用链如下:

android_view_SurfaceControl::nativeCreate
    SurfaceComposerClient::createSurfaceChecked -- 跨进程调用到 SurfaceFlinger
        Client::createSurface
            LayerCreationArgs::init      -- 包装参数
            SurfaceFlinger::createLayer  -- 创建Layer
                SurfaceFlinger::createBufferStateLayer -- buff类型
                    SurfaceFlingerDefaultFactory::createBufferStateLayer
                        Layer::init
                        Layer::onFirstRef 
                Layer::getHandle -- 获取句柄
                    LayerHandle::init
            SurfaceFlinger::addClientLayer -- 记录 Layer
                mCreatedLayers::emplace_back -- 保存在SurfaceFlinger中
                Client::attachLayer  -- 保存在Clinent中
                    mLayers::add
        SurfaceControl::init