Android5.0 显示系统(二)————SurfaceComposerClient

来源:互联网 发布:js bind 用法 编辑:程序博客网 时间:2024/06/05 02:44

图1 每个应用程序在SurfaceFlinger中都对应一个Client

      每一个应用程序都要和SurfaceFlinger通信,为了能够区分哪一个应用程序,所以有了SurfaceComposerClient。在《Android5.0 显示系统(一)》的例子中,我们分析代码

sp<SurfaceComposerClient> client = new SurfaceComposerClient();
SurfaceComposerClient的创建流程如下:

      SurfaceComposerClient对象的构造函数也没有什么,因为SurfaceComposerClient类是RefBase类派生类,所以我们来看下onFirstRef()方法。
frameworks\native\libs\gui\SurfaceComposerClient.cpp

SurfaceComposerClient::SurfaceComposerClient()    : mStatus(NO_INIT), mComposer(Composer::getInstance()){}
我们来看一下SurfaceComposerClient::onFirstRef()方法。
SurfaceComposerClient()->onFirstRef()
frameworks\native\libs\gui\SurfaceComposerClient.cpp
void SurfaceComposerClient::onFirstRef() {/*getComposerService()将返回SurfaceFlinger的Binder代理端的BpSurfaceFlinger对象*/    sp<ISurfaceComposer> sm(ComposerService::getComposerService());    if (sm != 0) {/*conn为BpSurfaceComposerClient*/        sp<ISurfaceComposerClient> conn = sm->createConnection();        if (conn != 0) {            mClient = conn;            mStatus = NO_ERROR;        }    }}
      onFirstRef()方法先调用了ComposerService类的getComposerService()方法来获取一个ISurfaceComposer的指针,然后调用它的createConnection()来得到一个ISurfaceComposerClient的指针,并且保存在mClient成员变量中。我们再来看ComposerService::getComposerService()函数,调用了connectLocked()函数。
SurfaceComposerClient()->onFirstRef()->getComposerService()
frameworks\native\libs\gui\SurfaceComposerClient.cpp
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");    }/*mComposerService为BpServiceComposer*/    return instance.mComposerService;}
      connectLocked()方法只是获取SurfaceFlinger的Binder对象,然后保存在mComposerService。ComposerService对象为SurfaceFlinger的Binder代理对象,请看类继承关系图;
SurfaceComposerClient()->onFirstRef()->connectLocked()
frameworks\native\libs\gui\SurfaceComposerClient.cpp
void ComposerService::connectLocked() {    const String16 name("SurfaceFlinger");/*mComposerService是SurfaceFlinger的代理对象*/    while (getService(name, &mComposerService) != NO_ERROR) {        usleep(250000);    }      ......   }
      所以最后在SurfaceComposerClient的onFirstRef()方法中,先是获取SurfaceFlinger的Binder对象,然后调用函数createConnection()方法,最终也是到SurfaceFlinger的createConnection()方法。我们来看SurfaceFlinger的createConnection函数,创建一个client对象(这也是一个Binder服务),最后返回这个对象。而返回的对象保存在SurfaceComposerClient类的mClient成员变量中。这样每一个连接都会有一个新的Client对象。
SurfaceComposerClient()->onFirstRef()->createConnection()
frameworks\native\libs\gui\ISurfaceComposer.cpp
virtual sp<ISurfaceComposerClient> createConnection(){    uint32_t n;    Parcel data, reply;    data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());    remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);    return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());}
frameworks\native\libs\gui\ISurfaceComposer.cpp
status_t BnSurfaceComposer::onTransact(    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){    switch(code) {        case CREATE_CONNECTION: {            CHECK_INTERFACE(ISurfaceComposer, data, reply);            sp<IBinder> b = createConnection()->asBinder();            reply->writeStrongBinder(b);            return NO_ERROR;        }    ......}
frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp
sp<ISurfaceComposerClient> SurfaceFlinger::createConnection(){    sp<ISurfaceComposerClient> bclient;/*创建一个Client,this为SurfaceFlinger*/    sp<Client> client(new Client(this));    status_t err = client->initCheck();    if (err == NO_ERROR) {        bclient = client;    }    return bclient;}
frameworks\native\services\surfaceflinger\Client.cpp
Client::Client(const sp<SurfaceFlinger>& flinger)    : mFlinger(flinger){}
Client类中的mFlinger成员保存的就是SurfaceFlinger对象。







原创粉丝点击