surface的创建过程

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

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bruk_spp

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

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

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

打赏作者

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

抵扣说明:

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

余额充值