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对象。
相关文章推荐
- Android5.0 显示系统(三)————Surface的创建
- GUI系统之SurfaceFlinger(11)SurfaceComposerClient
- Android显示系统框架原理介绍 原创 2016年03月23日 11:17:55 标签:surface /surfaceflinger /surfacecomposer /android /disp
- GUI系统之SurfaceFlinger(11)SurfaceComposerClient
- android surfaceflinger研究----显示系统
- AndroidN SurfaceComposerClient 时序图
- Android SurfaceFlinger中的SharedClient -- 客户端(Surface)和服务端(Layer)之间的显示缓冲区管理
- Android SurfaceFlinger中的SharedClient -- 客户端(Surface)和服务端(Layer)之间的显示缓冲区管理 .
- Activity创建到与SurfaceComposerClient建立通信流程
- Android SurfaceFlinger中的SharedClient -- 客户端(Surface)和服务端(Layer)之间的显示缓冲区管理 .
- GUI显示系统之SurfaceFlinger---章节目录
- GUI显示系统之SurfaceFlinger--- Gralloc与Framebuffer
- Android SurfaceFlinger中的SharedClient -- 客户端(Surface)和服务端(Layer)之间的显示缓冲区管理
- Android显示系统之View与SurfaceView更新屏幕的区别
- android surfaceflinger研究----显示系统
- SurfaceComposerClient object 问题
- GUI显示系统之SurfaceFlinger---章节目录
- Android: 显示系统模块加载以及调用流程 HWComposer::loadFbHalModule() -> framebuffer_open()
- Android4.0显示SurfaceTextureClient queuebuffer 队列
- Android SurfaceFlinger中的SharedClient -- 客户端(Surface)和服务端(Layer)之间的显示缓冲区管理