天天看點

顯示系統[2] APP建立SurfaceFlinger用戶端(client)的過程

分析上一篇例子應用程式發建立client 

對于建立client  首先是要獲得  SurfaceFlinger服務 其次通過binder調用其中函數建立 

SurfaceFlinger服務對應的應用程式代碼

  路徑frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp

int main(int, char**) {
    ...

    // instantiate surfaceflinger
    sp<SurfaceFlinger> flinger = new SurfaceFlinger();
    ...
// publish surface flinger
    sp<IServiceManager> sm(defaultServiceManager());
    sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
    ...
}
           

 SurfaceFlinger是由BnSurfaceComposer派生出來的也就是它的子類

  路徑  frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

SurfaceFlinger::SurfaceFlinger()
    :   BnSurfaceComposer(),
           

 BnSurfaceComposer繼承于ISurfaceComposer接口

BnSurfaceComposer 路徑   frameworks/native/libs/gui/include/gui/ISurfaceComposer.h

 由此可以看出ISurfaceComposer派生出兩個binder通信接口

    BnSurfaceComposer  、 BpSurfaceComposer

    而BnSurfaceComposer則派生出了SurfaceFlinger 

    這樣app端就可利用BpSurfaceComposer遠端調用到SurfaceFlinger中的函數

sp<SurfaceComposerClient> client = new SurfaceComposerClient();
           

 sp<SurfaceComposerClient>智能指針在初始化時調用

  路徑  frameworks/native/libs/gui/SurfaceComposerClient.cpp 

void SurfaceComposerClient::onFirstRef() {
    //獲得servicemanager
    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;
        }
    }
}
           

   ComposerService::getInstance().connectLocked(); 

/*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;
}
           
void ComposerService::connectLocked() {
    const String16 name("SurfaceFlinger");
    while (getService(name, &mComposerService) != NO_ERROR) {
        usleep(250000);
    }
...
}
           

  通過調用 connectLocked() 擷取SurfaceFlinger服務儲存到mComposerService中

  再通過上方ComposerService::getComposerService()函數傳回

  是以app端調用SurfaceComposerClient::onFirstRef()時獲得的sm就就等于                                 BpSurfaceComposer代理類對象,進而可以用這個對象進行binder通信調用SurfaceFlinger服    務中的函數

  接下來調用createConnection()

sp<ISurfaceComposer> sm(ComposerService::getComposerService());
...
sm->createConnection();
           

createConnection主要的作用就是利用BpSurfaceComposer代理類對象 構造資料進行binder通信調用CREATE_CONNECTION

這裡面就涉及到binder通信機制了這裡可以參考這個例子https://blog.csdn.net/we1less/article/details/118346184?spm=1001.2014.3001.5501

這裡面可以通過binder驅動調用到SurfaceFlinger中的onTransact函數

路徑  frameworks/native/libs/gui/ISurfaceComposer.cpp

class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
{
    ...
    virtual sp<ISurfaceComposerClient> createConnection()
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
    }
...
}
           

這裡又調用了父類的onTransact函數

路徑  frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp 

status_t SurfaceFlinger::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    status_t credentialCheck = CheckTransactCodeCredentials(code);
    if (credentialCheck != OK) {
        return credentialCheck;
    }

    status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
...
}
           

這裡又調用到子類SurfaceFlinger的createConnection()并且作為binder對象傳回

路徑  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 = IInterface::asBinder(createConnection());
            reply->writeStrongBinder(b);
            return NO_ERROR;
        }
 ...
}
           

 這裡面就是建立一個client對象然後把這個對象傳回回去

  最後再發給BpSurfaceComposer轉換成ISurfaceComposerClient傳回

  return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());

  路徑  frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
    return initClient(new Client(this));
}
           

最後傳回的Client

  路徑  frameworks/native/services/surfaceflinger/Client.h

class Client : public BnSurfaceComposerClient
           

 BnSurfaceComposerClient繼承自ISurfaceComposerClient

 由此可以看出ISurfaceComposerClient派生出兩個binder通信接口

    BnSurfaceComposerClient  、 BpSurfaceComposerClient

    而BnSurfaceComposerClient則派生出了Client 

   最後這個Client通過binder發送回SurfaceComposerClient中的mClient = conn;儲存

   這個mClient就指向SurfaceFlinger程序中的Client對象

class BnSurfaceComposerClient : public SafeBnInterface<ISurfaceComposerClient>