天天看點

應用程式程序與SurfaceFlinger的連接配接過程

我們從SurfaceComposerClient對象的建立開始分析應用程式與SurfaceFlinger的連接配接過程.每一個需要SurfaceFlinger渲染的應用程式都會建立一個SurfaceComposerClient對象,是這樣麼,我不确定,需要驗證.

SurfaceComposerClient類的聲明(在SurfaceComposerClient.h檔案中)如下:

class SurfaceComposerClient : public RefBase

SurfaceComposerClient類的構造函數定義如下:

SurfaceComposerClient::SurfaceComposerClient()

: mStatus(NO_INIT), mComposer(Composer::getInstance())

{

}

關于SurfaceComposerClient類的構造函數的詳細分析可以參考page2檔案.

因為SurfaceComposerClient繼承自RefBase,那麼當隻能指針第一次被引用時,就會調用onFirstRef函數, 我們就來看一下SurfaceComposerClient的onFirstRef函數的實作:

1void SurfaceComposerClient::onFirstRef() {

2 sp<ISurfaceComposer> sm(ComposerService::getComposerService());

3 if (sm != 0) {

4 sp<ISurfaceComposerClient> conn = sm->createConnection();

5 if (conn != 0) {

6 mClient = conn;

7 mStatus = NO_ERROR;

8 }

9 }

10}

關于SurfaceComposerClient的onFirstRef函數的實作的分析,可以參考page3檔案.

當調用完onFirstRef函數之後, SurfaceComposerClient對象的成員變量mClient就被初始化指向一個ISurfaceComposerClient的Binder代理對象,這樣SurfaceComposerClient對象就能通過這個ISurfaceComposerClient接口來請求SurfaceFlinger的服務了.

以上就是應用程式與SurfaceFlinger服務的連接配接過程的分析, 通過以上的分析, 我們可以得出以下結論:

No.1 每一個需要渲染UI的應用程式都會建立一個SurfaceComposerClient對象. 這是正确的麼?

No.2 每一個需要SurfaceFlinger服務的應用程式都會在SurfaceFlinger這一側建立一個Client對象, 并在應用程式這一側拿到一個ISurfaceComposerClient類型的Binder代理對象.

SurfaceComposerClient類的構造函數定義如下:

SurfaceComposerClient::SurfaceComposerClient()

: mStatus(NO_INIT), mComposer(Composer::getInstance())

{

}

在SurfaceComposerClient類中一個成員變量mComposer, 類型為Composer類的一個引用, 定義如下:

Composer& mComposer;

那麼這個mComposer的作用是什麼呢?且慢, 我們一點點的來分析.

我們先來看一下Composer類的定義,

Composer類的聲明如下:

class Composer : public Singleton<Composer>

由此可見Composer是一個單例的.

Composer的構造函數定義如下:

Composer() : Singleton<Composer>(),

mForceSynchronous(0), mTransactionNestCount(0),

mAnimation(false)

{

}

我們還是不知道mComposer是幹什麼的啊?那日後在分析吧.^-^

SurfaceComposerClient的onFirstRef函數的實作如下

1void SurfaceComposerClient::onFirstRef() {

2 sp<ISurfaceComposer> sm(ComposerService::getComposerService());

3 if (sm != 0) {

4 sp<ISurfaceComposerClient> conn = sm->createConnection();

5 if (conn != 0) {

6 mClient = conn;

7 mStatus = NO_ERROR;

8 }

9 }

10}

第一行(SurfaceComposerClient::onFirstRef)首先調用ComposerService::getComposerService()來獲得一個ISurfaceComposer的Binder代理對象.

我們首先看一下ComposerService類的聲明,位于frameworks/native/include/private/gui/ComposerService.h檔案中:

class ComposerService : public Singleton<ComposerService>

由此可見, ComposerService是一個單例的.

分析完ComposerService類的聲明, 我們看一下ComposerService的getComposerService函數的實作, 位于frameworks/native/libs/gui/SurfaceComposerClient.cpp檔案中, 定義如下:

1sp<ISurfaceComposer> ComposerService::getComposerService() {

2 ComposerService& instance = ComposerService::getInstance();

3 Mutex::Autolock _l(instance.mLock);

4 if (instance.mComposerService == NULL) {

5 ComposerService::getInstance().connectLocked();

6 assert(instance.mComposerService != NULL);

7 ALOGD("ComposerService reconnected");

8 }

9 return instance.mComposerService;

10}

ComposerService的getComposerService函數的主要邏輯是得到ComposerService執行個體,并判斷ComposerService執行個體的mComposerService是否為null, 如果是則表示還沒有得到SurfaceFlinger服務,那麼就會調用ComposerService執行個體的connectLocked函數來得到SurfaceFlinger服務, 如果不為null, 表示已經獲得了SurfaceFlinger服務,那麼直接傳回SurfaceFlinger.

是以我們接下來看一下ComposerService的connectLocked函數的實作, 位于frameworks/native/libs/gui/SurfaceComposerClient.cpp檔案中, 定義如下:

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:

DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }

};

mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));

IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);

}

在ComposerService的connectLocked函數中, 主要完成了兩件事: 第一,不斷地從ServiceManager中擷取SurfaceFlinger服務. 第二, 注冊一個Binder死亡通知.

我們回到SurfaceComposerClient::onFirstRef函數的分析中, 當得到SurfaceFlinger服務之後, 第4-8行(SurfaceComposerClient::onFirstRef)會調用SurfaceFlinger的createConnection函數,createConnection函數的定義如下:

1sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()

2{

3 sp<ISurfaceComposerClient> bclient;

4 sp<Client> client(new Client(this));

5 status_t err = client->initCheck();

6 if (err == NO_ERROR) {

7 bclient = client;

8 }

9 return bclient;

10}

createConnection函數的詳細分析可以參考page4檔案。

第6行(SurfaceComposerClient::onFirstRef)就把createConnection函數傳回的ISurfaceComposerClient的Binder接口儲存起來,這樣以後就能通過這個接口來請求SurfaceFlinger服務了。

SurfaceFlinger的createConnection函數的實作如下:

1sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()

2{

3 sp<ISurfaceComposerClient> bclient;

4 sp<Client> client(new Client(this));

5 status_t err = client->initCheck();

6 if (err == NO_ERROR) {

7 bclient = client;

8 }

9 return bclient;

10}

第4行(SurfaceFlinger::createConnection)首先建立了一個Client類型的對象,傳入的參數就是SurfaceFlinger對象。

Client類的聲明如下,位于frameworks/native/services/surfaceflinger/Client.h檔案中:

class Client : public BnSurfaceComposerClient

由此可見Client是一個Binder的本地對象。

Client類的構造函數定義如下, 位于frameworks/native/services/surfaceflinger/Client.cpp:

1Client::Client(const sp<SurfaceFlinger>& flinger)

2: mFlinger(flinger), mNameGenerator(1)

3{

4}

Client的構造函數隻是将Client的成員變量mFlinger指向SurfaceFlinger服務。

當構造完Client對象之後, 會在第5行(SurfaceFlinger::createConnection)調用Client的initCheck函數,initCheck的函數的定義如下:

status_t Client::initCheck() const {

return NO_ERROR;

}

可以看到initCheck函數隻是簡單的傳回了NO_ERROR。

最後會傳回這個Client對象。

由此可見, 每一個與SurfaceFlinger連接配接的應用程式在SurfaceFlinger這一側都會有一個Client對象,也就是ISurfaceComposerClient的Binder本地對象。

最後将這個ISurfaceComposerClient的Binder接口傳回給應用程式,這樣應用程式就可以用這個Binder接口來請求SurfaceFlinger為其服務了,這樣應用程式就和SurfaceFlinger建立了連接配接。