Android12 显示框架之SurfaceComposerClient创建
目录:Android显示终极宝典
SurfaceComposerClient是应用程序与SurfaceFlinger交互的客户端接口,在SurfaceFlinger服务端与之对应的名叫Client。SurfaceComposerClient和Client构成了应用程序和SurfaceFlinger之间进行交互的桥梁。每个SurfaceComposerClient在SurfaceFlinger都有一个Client实例一一对应,大概就如下面图里的样子。
应用程序要想创建surface并渲染图像提交合成显示等,第一步肯定要创建SurfaceComposerClient。
接下来就看看SurfaceComposerClient的创建过程。
new SurfaceComposerClient()
//frameworks/native/libs/gui/SurfaceComposerClient.cpp
SurfaceComposerClient::SurfaceComposerClient(): mStatus(NO_INIT)
{
}void SurfaceComposerClient::onFirstRef() {sp<ISurfaceComposer> sf(ComposerService::getComposerService());if (sf != nullptr && mStatus == NO_INIT) {sp<ISurfaceComposerClient> conn;conn = sf->createConnection();if (conn != nullptr) {mClient = conn;mStatus = NO_ERROR;}}
}
SurfaceComposerClient构造函数啥也没做,主要工作都放在onFirstRef()中完成的。这里的ComposerService存在的意义是为了获取SurfaceFlinger的客户端代理,而刻意去隐藏这个获取的过程。然后直接调用SurfaceFlinger的createConnection()功能。
createConnection()
//frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {const sp<Client> client = new Client(this);return client->initCheck() == NO_ERROR ? client : nullptr;
}//frameworks/native/services/surfaceflinger/Client.cpp
Client::Client(const sp<SurfaceFlinger>& flinger): mFlinger(flinger)
{
}
目的很单纯,在SurfaceFlinger中创建一个Client,并且通过binder将它传到应用端保存起来。为什么要返回到应用端保存?一是以为这么做对应用来说只是举手之劳而且很合理,二是因为放在SurfaceFlinger中去一一甄别只会增大SurfaceFlinger的复杂度而得不偿失。Client与应用程序是一一绑定的,应用程序每次访问SurfaceFlinger时把它作为参数传递进来,SurfaceFlinger自然就知道是谁。
简单画个图总结一下: