先给出本篇的主要结论:
1.ISurfaceComposer,ISurfaceComposerClient, ISurfaceTexture,ISurface这四个接口描述了SurfaceFlinger系统及其客户端的定义和协作方式。2.ISurfaceComposer定义了SurfaceFlinger系统,它的server端的具体实现类是SurfaceFlinger。它的Proxy端封装在类ComposerService中。ComposerService的定义在SurfaceComposerClient.h中。 SurfaceFlinger的客户端通过ComposerService与SurfaceFlinger系统 通信。
3.ISurfaceComposerClient定义了SurfaceFlinger系统的客户端,它的server端的具体实现类是Client, 定义在SurfaceFlinger.h中。它的Proxy端封装在类 SurfaceComposerClient中,每个SurfaceComposerClient的创建都会使SurfaceFlinger系统创建类Client的一个实例。ISurfaceComposerClient接口只提供两个操作createSurface和destroySurface。
4.ISurfaceTexture接口非常重要,是连接SurfaceFlinger系统及其客户端的桥梁,ISurfaceTexture接口的server端实现是SurfaceTexture。ISurfaceTexture接口的proxy端的具体实现封装在SurfaceTextureClient中。Surface是SurfaceTextureClient的子类,客户端通过Surface实例与server端的SurfaceTexture协作。SurfaceTexture中维护着一组GraphicBuffer,这组GraphicBuffer被SurfaceFlinger及其客户端使用。客户端通过Surface(即通过SurfaceTextureClient)提供的接口获得这组 GraphicBuffer的某一空闲块,将需要显示的屏幕内容绘制在其上,然后再通过Surface(即通过SurfaceTextureClient)提供的接口将这块含有屏幕内容的Buffer放回队列。SurfaceFlinger通过Layer操作这组GraphicBuffer中含有当前屏幕内容的一块,通过Layer调用SurfaceTexture中封装的gles操作,将包含屏幕内容的GraphicBuffer上传给纹理,再通过LayerBase::drawWithOpenGL中调用glDrawArrays将纹理内容渲染到framebuffer。SurfaceFlinger接着调用egl接口eglSwapBuffer将绘制好的framebuffer显示在屏幕上。
5.Layer类中封装了SurfaceTexture,SurfaceTexture中维护着一组GraphicBuffer,屏幕内容会先绘制在这组GraphicBuffer上。
6.ISurface的Server端实现类是Layer::createSurface()函数中创建的类Bsurface,ISurface的proxy端封装在类Surface中,ISurface只提供一个操作getSurfaceTexture。Surface调用这个接口取得SurfaceTexture的proxy端,以便与SurfaceTexture通信。
下面的类图是ISurfaceComposer,ISurfaceComposerClient,ISurfaceTexture,ISurface这四个接口的Binder结构,封装各个接口Proxy端的类也一并给出,便于后面分析:
接下来看几组类之间关系的建立过程。
1.SurfaceComposerClient与SurfaceFlinger之间关系的建立过程分析
Android4.0.1 Activity的DecorView与SurfaceFlinger的Surface之间关系的建立过程分析中提到过
WindowMangerService中代表客户端的Session会创建一个SurfaceSession实例,这个SurfaceSession
实例代表着与SurfaceFlinger之间的一个连接。SurfaceSession的构造函数会调用native函数init(),
这个函数的实现SurfaceSession_init()定义在android_view_surface.cpp中。
SurfaceSession_init()函数会创建一个SurfaceComposerClient实例,并将这个实例保存到java层
SurfaceSession的mClient变量中。SurfaceSession_init()在创建完SurfaceComposerClient实例后会
1.SurfaceComposerClient与SurfaceFlinger之间关系的建立过程分析
Android4.0.1 Activity的DecorView与SurfaceFlinger的Surface之间关系的建立过程分析中提到过
WindowMangerService中代表客户端的Session会创建一个SurfaceSession实例,这个SurfaceSession
实例代表着与SurfaceFlinger之间的一个连接。SurfaceSession的构造函数会调用native函数init(),
这个函数的实现SurfaceSession_init()定义在android_view_surface.cpp中。
SurfaceSession_init()函数会创建一个SurfaceComposerClient实例,并将这个实例保存到java层
SurfaceSession的mClient变量中。SurfaceSession_init()在创建完SurfaceComposerClient实例后会