Android UI架构(三)--Activity的显示(2).md

本文详细解析了SurfaceSession的创建过程,从Java层到Native层,再到SurfaceComposerClient和服务端SurfaceFlinger之间的交互。通过分析SurfaceSession如何连接到SurfaceFlinger,并创建SurfaceComposerClient,为读者揭示了Android系统中视图绘制的基础机制。

参考资料

一、SurfaceSession的创建

在上一篇文章(一个Activity的显示(1))中,我们最后发现Activity launch的时候创建的Window会创建一个SurfaceSession的对象。
现在我们看看这个对象是用来干什么的。

1.1 SurfaceSession 的创建

    /** Create a new connection with the surface flinger. */
    public SurfaceSession() {
        mNativeClient = nativeCreate();
    }

进入native层。

1.2 android_view_SurfaceSession.cpp:nativeCreate

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

创建的是SurfaceComposerClient对象

1.3 SurfaceComposerClient.cpp 的创建

SurfaceComposerClient::SurfaceComposerClient()
    : mStatus(NO_INIT)
{
}

void SurfaceComposerClient::onFirstRef() {
    // 1.4 sf 看名字猜测这个是 SurfaceFlinger
    sp<ISurfaceComposer> sf(ComposerService::getComposerService());
    if (sf != 0 && mStatus == NO_INIT) {
        // mParent 是 wp<IGraphicBufferProducer> 类型的指针
        // 这里其实是空的
        auto rootProducer = mParent.promote();
        sp<ISurfaceComposerClient> conn;
        // 1.5 所以 conn = sf->createConnection()
        conn = (rootProducer != nullptr) ? sf->createScopedConnection(rootProducer) :
                sf->createConnection();
        if (conn != 0) {
            mClient = conn; // 保存创建的Connection
            mStatus = NO_ERROR;
        }
    }
}

1.4 SurfaceComposerClient.cpp:ComposerService:getComposerService

/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
    ComposerService& instance = ComposerService::getInstance();
    Mutex::Autolock _l(instance.mLock);
    if (instance.mComposerService == NULL) {
        ComposerService::getInstance().connectLocked();
        assert(instance.mComposerService != NULL);
        ALOGD("ComposerService reconnected");
    }
    return instance.mComposerService;
}

1.4.1 ComposerService 的初始化

ComposerService::ComposerService()
: Singleton<ComposerService>() {
    Mutex::Autolock _l(mLock);
    connectLocked();
}

void ComposerService::connectLocked() {
    // 果然是创建和SurfaceFlinger的通信
    const String16 name("SurfaceFlinger");
    // 获取名为“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);
}

ComposerService 的初始化就是获取SurfaceFlinger服务,即将 mComposerService 指向SurfaceFlinger

1.5 SurfaceFlinger.cpp:createConnection

sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
    return initClient(new Client(this));
}
Client::Client(const sp<SurfaceFlinger>& flinger)
    : Client(flinger, nullptr)
{
}
Client::Client(const sp<SurfaceFlinger>& flinger, const sp<Layer>& parentLayer)
    : mFlinger(flinger),
      mParentLayer(parentLayer)
{
}
static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
    status_t err = client->initCheck();
    if (err == NO_ERROR) {
        return client;
    }
    return nullptr;
}

这里就是创建了一个 Client 类型的对象,这个对象持有一个指向 SurfaceFlinger 的sp指针.

1.6 简略顺序图

在这里插入图片描述

小结

在继续分析之前我们先看看SurfaceFlinger这个庞然大物是怎么启动的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值