surface的创建过程

本文详细剖析了Android中Surface的创建过程,从ViewRootImpl的mSurface开始,经过SurfaceSession的创建,到SurfaceComposerClient、SurfaceControl的生成,最终完成Surface的初始化。涉及关键步骤包括SurfaceSession的JNI创建、SurfaceFlinger的交互以及WindowSurfaceController的构造。

还是首先来看一个序列图:
在这里插入图片描述

1.ViewRootImpl.mSurface

ViewRootImpl这个类是是处理视图绘画,input输入,调用wms调用窗口的核心类。其成员变量mSurface在申明的时候就初始化了:

    final Surface mSurface = new Surface();

上面干巴巴的创建了Surface实例,进去看Surface这个类的无参构造函数也是个空的,所以还要继续往下分析

2.SurfaceSession的创建

在wms窗口管理过程中,视图的添加过程
ViewRootImpl.setView-> session.addToDisplay->WMS.addWindow
在WMS中添加窗口WindowState完成后,会调用WindowState类的attach函数
在这里插入图片描述

    void attach() {
   
   
        if (localLOGV) Slog.v(TAG, "Attaching " + this + " token=" + mToken);
        mSession.windowAddedLocked(mAttrs.packageName);
    }
    void windowAddedLocked(String packageName) {
   
   
        mPackageName = packageName;
        mRelayoutTag = "relayoutWindow: " + mPackageName;
        if (mSurfaceSession == null) {
   
   
            if (WindowManagerService.localLOGV) Slog.v(
                TAG_WM, "First window added to " + this + ", creating SurfaceSession");
            mSurfaceSession = new SurfaceSession();
            if (SHOW_TRANSACTIONS) Slog.i(
                    TAG_WM, "  NEW SURFACE SESSION " + mSurfaceSession);
            mService.mSessions.add(this);
            if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
   
   
                mService.dispatchNewAnimatorScaleLocked(this);
            }
        }
        mNumWindow++;
    }

上面就可以看到session的成员变量mSurfaceSession的赋值操作,这里通过
new SurfaceSession()创建了一个实例,下面我们看看SurfaceSession的构造函数。

3.SurfaceSession

    private long mNativeClient; // SurfaceComposerClient*

    public SurfaceSession() {
   
   
        mNativeClient = nativeCreate();
    }

    public SurfaceSession(Surface root) {
   
   
        mNativeClient = nativeCreateScoped(root.mNativeObject);
    }

这里就是获取SurfaceComposerClient的指针地址,而其实现方式是通过JNI来的,这里我们来看看其JNI的实现

4android_view_SurfaceSession.nativeCreate

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

上面的代码就是new了一个SurfaceComposerClient对象,然后返回了这个对象的地址,也就是我们实际得到的是SurfaceComposerClient实例

5.SurfaceComposerClient

SurfaceComposerClient::SurfaceComposerClient()
    : mStatus(NO_INIT), mComposer(Composer::getInstance())
{
   
   
}

SurfaceComposerClient::SurfaceComposerClient(const sp<IGraphicBufferProducer>& root)
    : mStatus(NO_INIT), mComposer(Composer::getInstance()), mParent(root)
{
   
   
}

void SurfaceComposerClient::onFirstRef() {
   
   
    sp<ISurfaceComposer> sm(ComposerService::getComposerService());
    if (sm != 0) {
   
   
        auto rootProducer = mParent.promote();
        sp<ISurfaceComposerClient> conn;
        conn = (rootProducer != nullptr) ? sm->createScopedConnection(rootProducer) :
                sm->createConnection();
        if (conn != 0) {
   
   
            mClient = conn;
            mStatus = NO_ERROR;
        }
    }
}
void ComposerService::connectLocked() {
   
   
    const String16 name("SurfaceFlinger");
    while (getService(name, &mComposerService) != NO_ERROR) {
   
   
        usleep(250000);
    }
    assert(mComposerService != NULL);

    // Create the death listener.
    class DeathObserver : public IBinder::DeathRecipient {
   
   
        ComposerService& mComposerService;
        virtual void binderDied(const wp<IBinder>& who) {
   
   
            ALOGW("ComposerService remote (surfaceflinger) died [%p]",
                  who.unsafe_get());
            mComposerService.composerServiceDied();
        }
     public:
        explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) {
   
    }
    };

    mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
    IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);
}

1.在onFirstRef函数里面会获取fingerprint的服务,看connectLocked实现就可以确定,通过getservice这个API获取指定的SurfaceFlinger服务实例,这样一来client就和surfaceflinger建立了联系。
2.当获取了Surfaceflinger实例后,调用createScopedConnection来创建client

6.createScopedConnection

sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection
在 Android 平台中,创建 `Surface` 是一个涉及多个组件协作的过程,主要涉及应用层(App)、窗口管理服务(WMS)以及图形合成服务(SurfaceFlinger)。以下是创建 Surface 的主要步骤: ### 创建 Surface 的流程 #### 1. 应用与 WMS 建立联系 应用在请求创建窗口时,会通过 `WindowManager` 与 `WindowManagerService`(WMS)建立连接。WMS 负责管理窗口的生命周期和属性,包括 Surface创建和配置。 #### 2. WMS 创建 SurfaceControl 在 WMS 端,通过 `SurfaceControl` 来创建和管理 Surface。`SurfaceControl` 是 WMS 操作 Surface 的控制接口,用于设置 Surface 的位置、Z 轴顺序、透明度等属性[^2]。例如: ```java SurfaceControl surfControl = new SurfaceControl(sess, "test", width, height, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); ``` #### 3. App 端创建 Surface 在应用端,通过 `Surface` 类来创建一个与 WMS 中 `SurfaceControl` 对应的 Surface 对象。这个 Surface 对象通常用于与本地层(Native Layer)交互,例如用于渲染图形内容。 #### 4. Native 层的 Surface 创建 在本地层,`Surface` 的创建通常涉及与 `SurfaceFlinger` 的交互。`SurfaceFlinger` 负责管理图层的合成,`Surface` 在这里被创建为一个图形缓冲区(Graphic Buffer),用于接收和显示图形数据。例如,可以创建一个继承自 `Surface` 的类 `BBQSurface` 来实现特定的图形处理逻辑[^3]。 ```cpp sp<BBQSurface> surface = new BBQSurface(); ``` #### 5. 应用使用 Surface 应用可以通过 `SurfaceHolder` 或直接使用 `Surface` 对象来绘制内容。例如,在 `SurfaceView` 中,应用可以通过 `SurfaceHolder` 获取 `Surface` 并进行绘制: ```java SurfaceHolder holder = surfaceView.getHolder(); Canvas canvas = holder.lockCanvas(); // 绘制内容 holder.unlockCanvasAndPost(canvas); ``` ### 总结 创建 Surface过程涉及多个 Android 系统组件的协作,包括应用层、WMS 和 SurfaceFlinger。通过上述步骤,可以在 Android 平台上成功创建并使用 Surface 来进行图形渲染和显示。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bruk_spp

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值