SurfaceFlinger学习笔记

应用进程

ComposerService:

定义:frameworks\native\include\private\gui\ComposerService.h
实现:frameworks\native\libs\gui\SurfaceComposerClient.cpp
作用:通过Singleton,定义单例类,初始化时候调用connectLocked,获取SurfaceFlinger服务代理ISurfaceComposer,并注册死亡通知

SurfaceComposerClient:

定义:frameworks\native\include\gui\SurfaceComposerClient.h
实现:frameworks\native\libs\gui\SurfaceComposerClient.cpp
作用:这个对象会和SurfaceFlinger进行交互,因为SurfaceFlinger派生于SurfaceComposer
通过ComposerService和服务端通信,并通过调用binder的createConnection获取ISurfaceComposerClient
onFirstRef:第一次引用的时候,调用binder的createConnection才真正的建立连接

SurfaceFlinger进程

进程启动:

SurfaceFlinger是一个系统级的服务,Android系统启动的过程中就会启动SurfaceFlinger,通过init.rc配置bin启动
SurfacFlinger进程中主要4个服务:

  • startHidlServices主要是启动allocator
  • DisplayService,主要负责DisplayEvent的处理
  • SurfaceFlinger,主要显示相关的,最重要的服务
  • GpuService,GPU相关的服务,为访问GPU

Client和SurfaceFlinger的关系:
在这里插入图片描述
应用端SurfaceComposerClient通过接口ISurfaceComposerClient和SurfaceFlinger的Client建立联系。应用端通过的ComposerService通过ISurfaceComposer和SurfaceFlinger建立联系

Client:

定义:frameworks/native/services/surfaceflinger/Client.h
实现:frameworks/native/services/surfaceflinger/Client.cpp
作用:继承BnSurfaceComposerClient,作为ISurfaceComposerClient的服务端

SurfaceFlinger:

定义:frameworks/native/services/surfaceflinger/SurfaceFlinger.h
实现:frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
作用:SurfaceComposer是ISurfaceComposer的Bn端。实现了HWC2的ComposerCallback回调。死亡回收DeathRecipient,以及Dump信息PriorityDumper。为SurfaceFlinger服务端.

createConnection: new一个Client(即SurfaceComposerClient服务端)
init::

  • 初始化EGL
  • 创建两个EventThread及其DispSyncSource,主要是用以处理和分发Vsync;App和SurfaceFlinger的Vsync是分开的,不是同一个。
  • 创建了自己的消息队列mEventQueue,SurfaceFlinger的消息队列
  • 初始化了Client合成模式(GPU)合成时,需要用到的RenderEngine
  • 初始化HWComposer,注册回调接口registerCallback,HAL会回调一些方法。
  • 如果是VR模式,创建mVrFlinger
  • 创建mEventControlThread,处理Event事件,如Vsync事件和hotplug事件。
  • 初始化显示设备initializeDisplays

DisplayDevice:

定义:frameworks/native/services/surfaceflinger/DisplayDevice.h
实现:frameworks/native/services/surfaceflinger/DisplayDevice.cpp
作用:Android支持多屏幕,多个屏幕可以显示一样的内容,也可以显示不一样的内容。我们通常的把他们称为主显,外显和虚显。主显就是内置的,默认的手机屏幕;外显就是HDMI,MHL等连接的屏幕;虚显,就是虚拟显示器,通过WFD连接的屏幕,或者是类似屏幕一样的Buffer消费者。
每添加一个显示屏,都会创建一个DisplayDevice,屏幕都是通过ID来标记的,一个屏幕可以有多个config信息,当前再用的是activeconfig,在SurfaceComposerClient中,获取config信息时,先获取多有的config信息,再获取active的config的ID,根据ID去取DisplayInfo

struct DisplayInfo {
uint32_t w{0}; // 屏幕的宽
uint32_t h{0}; // 屏幕的高
float xdpi{0}; // 屏幕的x方向每英寸的像素点
float ydpi{0}; // 屏幕y方向每英寸的像素点
float fps{0}; // FPS屏幕的刷新率
float density{0}; // 屏幕的密度
uint8_t orientation{0}; // 屏幕的旋转方式
bool secure{false}; // 屏幕是否是安全的
nsecs_t appVsyncOffset{0}; // App的Vsync的偏移
nsecs_t presentationDeadline{0}; // 显示的最后时间
};

屏幕是否安全secure
这主要是用于DRM(数字版权保护)时,确保显示的设备是安全的,以防止DRM的内容被在显示的过程中被截取。只有安全的设备才能显示DRM的内容。
Android默认,所有的非虚拟显示都是安全的。
info.secure = true;

frameworks/native/services/surfaceflinger/DisplayDevice.h
enum DisplayType {
DISPLAY_ID_INVALID = -1,
DISPLAY_PRIMARY = HWC_DISPLAY_PRIMARY, //主显
DISPLAY_EXTERNAL = HWC_DISPLAY_EXTERNAL, //外显
DISPLAY_VIRTUAL = HWC_DISPLAY_VIRTUAL, //虚显4
NUM_BUILTIN_DISPLAY_TYPES = HWC_NUM_PHYSICAL_DISPLAY_TYPES,
};

应用的SurfaceComposerClient获取: sp SurfaceComposerClient::getBuiltInDisplay(int32_t id) { return ComposerService::getComposerService()->getBuiltInDisplay(id); }