Android 12(S) 图像显示系统 - 应用建立和SurfaceFlinger的沟通桥梁(三)
1 前言
上一篇文章中我们已经创建了一个Native示例应用,从使用者的角度了解了图形显示系统API的基本使用,从这篇文章开始我们将基于这个示例应用深入图形显示系统API的内部实现逻辑,分析运作流程。
本篇将聚焦应用和SurfaceFlinger的活动,即应用是如何与SurfaceFlinger这个服务建立连接并进行通信的。让我们开始吧!
注:本篇涉及的代码位置:
/frameworks/native/libs/gui/include/gui/
/frameworks/native/libs/gui/include/private/gui/
/frameworks/native/services/surfaceflinger/
2 应用和SurfaceFlinger的通信
应用运行一开始便首先要去创建一个Native Surface,此时即开始了与SurfaceFlinger的互动,分步来看创建Surface的过程:
- SurfaceFlinger系统服务的Binder RPC架构
在分析详细的代码前,我想先展示一下 SurfaceFlinger系统服务的Binder RPC架构,其中涉及哪些类?哪些接口?它们之间的关系如何?在宏观上去对这些对象的关系做了解,有助于我们理解具体的代码分析。
先看一张基本的类图:
SurfaceFlinger作为典型的Binder系统服务,遵循Binder服务设计的一般原则:
Interface接口:ISurfaceComposer 、ISurfaceComposerClient
Bp客户端:BpSurfaceComposer、BpSurfaceComposerClient
Bn服务端:BnSurfaceComposer、BnSurfaceComposerClient
服务实现:SurfaceFlinger、Client
具体Binder的原理在此就不展开讲了,相信你在网络上可以搜索到很多优秀的讲解文章。
这里请先留意两点:
- ComposerService中有成员mComposerService,它代表了SurfaceFlinger服务的代理客户端;
- SurfaceComposerClient中有成员mClient,它代表了SurfaceFlinger服务进程中的Client的代理客户端(这里应该是涉及所谓的匿名Binder的概念)
推荐两篇博文:https://blog.csdn.net/lewif/article/details/50696510
https://my.oschina.net/u/3897543/blog/4750360
- 创建SurfaceComposerClient并建立与SurfaceFlinger的连接