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对象。
阅读全文
0 0
- Android5.0 显示系统(二)————SurfaceComposerClient
- Android5.0 显示系统(一)————从一个简单的例子开启
- Android5.0 显示系统(三)————Surface的创建
- 在Android4.2中实现bluetooth A2dp Sink(二)——移植Android5.0蓝牙协议栈
- Android5.0 输入系统(一)————InputManagerService服务及相关对象的创建与启动
- Android5.0机顶盒开发-修改系统音量进度条的显示
- Android5.0材料设计(二)
- GUI系统之SurfaceFlinger(11)SurfaceComposerClient
- GUI系统之SurfaceFlinger(11)SurfaceComposerClient
- Android5.0系统字库
- Android5.0开关机模块——init进程
- Android5.0开关机模块——zygote进程
- Android5.0开关机模块——SystemServer进程
- Android5.0——Linux内核存储协议栈图
- Android5.0源码分析—— Zygote进程分析
- Android5.0适配——水波纹点击效果
- Android5.0新特性——Material Design简介
- Android5.0源码分析—— Zygote进程分析
- UGUI +ScrollRect下实现动态添加grid子物体
- MySQL学习笔记(一):修改MySQL中的提示符
- ubuntu 17.10 常用软件安装
- 利用时间序列预测用户系统是否过载
- hbase常用命令
- Android5.0 显示系统(二)————SurfaceComposerClient
- JTA 分布式事务
- vim_config使用说明
- mysql常用操作总结
- java socket
- 一周四次课(10月19日)
- C++/C语言函数:isalpha()函数
- C++ 中函数的一些概念
- Java 中的日期与时间处理