分析上一篇例子應用程式發建立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>