SurfaceFlinger服务:运行在Android系统的System进程中,负责管理Android系统的帧缓冲区(Frame Buffer)。
每一个Android应用程序与SurfaceFlinger服务都有一个连接,这个连接都是通过一个类型为Client的Binder对象来描述的。
每一个Android应用程序与SurfaceFlinger服务之间的连接上加上一块用来传递UI元数据的匿名共享内存,这个匿名共享内存结构化为SharedClient。
每一个SharedClient里面,有至多31个SharedBufferStack;一个SharedClient对应一个Android应用程序
每一个SharedBufferStack用来描述一系列需要按照一定规则来访问的缓冲区。
真正的UI数据保存在GraphicBuffer中
- Android应用程序与SurfaceFlinger服务建立连接的过程
SurfaceComposerClient对象负责创建一个到SurfaceFlinger服务的连接。
成员函数getControlBlock用来获得由SurfaceFlinger服务创建的一块用来传递UI元数据的匿名共享内存,
成员函数createSurface用来请求SurfaceFlinger服务创建一个Surface
应用程序bootanimation与SurfaceFlinger服务建立一个连接的序列图:
- 保存UI元数据的匿名共享内存的创建过程
Android系统就通过一个单例模式的类来专负责创建和管理这个SharedClient对象
创建匿名共享内存相关的类:SurfaceClient、UserClient、SharedClient
UserClient类与Client类最重要的区别是:
前者实现了ISurfaceComposerClient接口的成员函数getControlBlock,
后者实现了ISurfaceComposerClient接口的成员函数createSurface
共享UI元数据的创建过程序列图:
UserClient类的成员变量mCblkHeap指向了一块匿名共享内存,
UserClient类将这块匿名共享内存返回给Android应用程序之后,Android应用程序就会将它结构化成一个SharedClient对象来访问,并且保存在SurfaceClient类的成员变量mControl中
- Android应用程序请求SurfaceFlinger服务创建Surface的过程
Surface理解为一个绘图表面,
Android应用程序负责往这个绘图表面填内容,
SurfaceFlinger服务负责将这个绘图表面的内容取出来,并且渲染在显示屏上。
从SurfaceFlinger服务侧:
Layer类内部的成员变量mUserClientRef指向了一个ClientRef对象;
ClientRef对象内部成员变量mControlBlock指向了一个SharedBufferServer对象;
SharedBufferServer类是用来在SurfaceFlinger服务这一侧描述一个UI元数据缓冲区堆栈的,
即在SurfaceFlinger服务中,每一个绘图表面,即一个Layer对象,都关联有一个UI元数据缓冲区堆栈。
Android应用程序这一侧:
每一个绘图表面都使用一个Surface对象来描述;
每一个Surface对象都是由一个SurfaceControl对象来创建的。
SurfaceControl类的成员变量mSurface,指向了一个类型为BpSurface的Binder代理对象,而这个Binder代理对象引用的是一个Layer::SurfaceLayer对象。
SurfaceControl类的成员变量mSurfaceData,指向了一个Surface对象。
Surface类的成员变量mSharedBufferClient指向了一个SharedBufferClient对象;
SharedBufferClient类是用来在Android应用程序这一侧描述一个UI元数据缓冲区堆栈的。
Surface类继承了EGLNativeBase类,而EGLNativeBase类又继承了ANativeWindow类,
Android系统为OpenGL库提供的本地窗口使用ANativeWindow类来描述。
一个绘图表面,在SurfaceFlinger服务和Android应用程序中分别对应有一个Layer对象和一个Surface对象
这两个对象在内部分别使用一个SharedBufferServer对象和一个SharedBufferClient对象来描述这个绘图表面的UI元数据缓冲堆栈
当Android应用程序请求SurfaceFlinger服务创建一个Surface的时候:
需要在SurfaceFlinger服务这一侧创建一个Layer对象、一个Layer::SurfaceLayer对象和一个SharedBufferServer对象;
需要在Android应用程序这一侧创建一个SurfaceControl对象、一个Surface对象和一个SharedBufferClient对象。
SurfaceComposerClient类的成员函数createSurface开始描述Android应用程序请求SurfaceFlinger服务创建Surface的过程:
- Android应用程序请求SurfaceFlinger服务渲染Surface的过程
Android应用程序渲染一个Surface的过程大致如下所示:
1. 从UI元数据缓冲区堆栈中得到一个空闲的UI元数据缓冲区;
2. 请求SurfaceFlinger服务为这个空闲的UI元数据缓冲区分配一个图形缓冲区;
3. 在图形缓冲区上面绘制好UI之后,即填充好UI数据之后,就将前面得到的空闲UI元数据缓冲区添加到UI元数据缓冲区堆栈中的待渲染队列中去;
4. 请求SurfaceFlinger服务渲染前面已经准备好了图形缓冲区的Surface;
5. SurfaceFlinger服务从即将要渲染的Surface的UI元数据缓冲区堆栈的待渲染队列中找到待渲染的UI元数据缓冲区;
6. SurfaceFlinger服务得到了待渲染的UI元数据缓冲区之后,接着再找到在前面第2步为它所分配的图形缓冲区,最后就可以将这个图形缓冲区渲染到设备显示屏上去。