SF提供与其他进程通信的两个Binder : ISurfaceComposer、ISurfaceComposerClient。
每个应用进程会创建一个SurfaceComposerClient对象,用于和SF通信SurfaceComposerClient实例创建后调用onFirstRef
/frameworks/native/libs/gui/SurfaceComposerClient.cpp
ini
void SurfaceComposerClient::onFirstRef() {
// 1.
sp<ISurfaceComposer> sf(ComposerService::getComposerService());
if (sf != nullptr && mStatus == NO_INIT) {
sp<ISurfaceComposerClient> conn;
// 2.
conn = sf->createConnection();
if (conn != nullptr) {
mClient = conn;
mStatus = NO_ERROR;
}
}
}
onFirstRef中获取了ISurfaceComposer和ISurfaceComposerClient两个binder的代理对象
-
通过ServiceManager获取SurfaceFlinger 服务代理对象
- ComposerService::getComposerService()
- -> ComposerService::getInstance().connectLocked()
- /frameworks/native/libs/gui/SurfaceComposerClient.cpp
arduino
68 bool ComposerService::connectLocked() {
69 const String16 name("SurfaceFlinger");
//waitForService是通过ServiceManager获取系统服务
70 mComposerService = waitForService<ISurfaceComposer>(name);
71 if (mComposerService == nullptr) {
72 return false; // fatal error or permission problem
73 }
74
... ...
90 }
- 通过sf->createConnection(),获取ISurfaceComposerClient代理对象
/frameworks/native/libs/gui/ISurfaceComposer.cpp
kotlin
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());
}
}
调用到服务端BnSurfaceComposer
css
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;
... ...
最后在SurfaceFlinger 中会创建一个Client对象,即BnSurfaceComposerClient对象,所以每个应用进程在SurfaceFlinger中都有一个Client对象与之对应
/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
arduino
522 sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
523 const sp<Client> client = new Client(this);
524 return client->initCheck() == NO_ERROR ? client : nullptr;
525 }
Client对象持有SurfaceFlinger的引用
kotlin
class Client : public BnSurfaceComposerClient
{
... ...
sp<SurfaceFlinger> mFlinger;
}
到此涉及到的类关系图如下:

- ISurfaceComposer:应用端与SurfaceFlinger 通信,主要是SurfaceFlinger提供的各种操作,如 setTransactionState更新状态去触发合成
- ISurfaceComposerClient:应用端与SurfaceFlinger进程的Client通信,主要是是layer 相关操作,如createLayer 等