您的位置:首页 > 移动开发 > Android开发

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

2017-10-19 22:11 302 查看


图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对象。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐