下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

详解Android创建Surface过程源码分析教程

作者:课课家教育     来源: http://www.kokojia.com点击数:3047发布时间: 2019-04-05 09:09:47

标签: AndroidSurfaceSurfaceAndroid

      SurfaceFlinger英文直译就是surface的投递者,surface就不用翻译了,翻译了反而不好理解。SurfaceFlinger是Android的一个服务,其负责管理应用端的surface,将所有的surface复合。他是介于图形库和应用之间的一层。每个应用在它自己的surface完成各种图形操作后,请求SurfaceFlinger显示到屏幕,surfaceflinger就会将所有的surface叠加起来,并且反映到framebuffer。

      在上一篇文章Android SurfaceFlinger服务代理对象获取过程源码分析中介绍了应用程序获取SurfaceFlinger中的各种远程Binder代理对象,SurfaceFlinger为每个应用程序创建Client对象来处理应用程序的Binder请求,同时返回Client的Binder代理对象给应用程序,这样应用程序就可以通过该Binder代理对象来请求SurfaceFlinger创建Surface了,本文在前面章节的基础上分析Surface在服务端创建对应的Layer对象过程,并将BSurface远程代理对象返回给应用程序。

详解Android创建Surface过程源码分析教程_AndroidSurface_Surface_Android_课课家

  首先在应用程序端构造SurfaceComposerClient对象,在构造过程中,通过ComposerService类查询到SurfaceFlinger服务的远程代理对象,并通过SurfaceFlinger的远程Binder代理对象连接SurfaceFlinger,获取SurfaceFlinger为应用程序创建的Client的远程代理对象,关于应用程序查询SurfaceFlinger服务代理对象,应用程序连接SurfaceFlinger的过程请查看Android SurfaceFlinger服务代理对象获取过程源码分析。得到SurfaceComposerClient对象后,就可以调用该对象的createSurface函数来创建Surface了,同时得到一个SurfaceControl对象。

  将当前进程的ID号格式化为<pid_%d>的字符串来命名当前创建的Surface,然后调用SurfaceComposerClient的另一个重载函数createSurface来创建Surface

  在Android SurfaceFlinger服务代理对象获取过程源码分析中我们知道,应用程序获得Client的远程代理对象BpSurfaceComposerClient后,保存到成员变量mClient中,这里就是通过Client的远程代理对象BpSurfaceComposerClient向服务端的Client请求创建Surface,并得到BSurface的远程Binder代理对象BpSurface,接着利用得到的BpSurface对象及SurfaceComposerClient对象为应用程序创建一个SurfaceControl对象。ISurface也是基于Binder进程通信框架设计的,其在Binder通信框架中的类关系图如下:

  由于ISurfaceComposerClient也是基于Binder通信框架的,因此BpSurfaceComposerClient向服务端的Client请求创建Surface的过程分为客户端进程和服务端进程。

  客户端进程:

  frameworks\\native\\libs\\gui\\ISurfaceComposerClient.cpp

  

  服务端进程:

  frameworks\\native\\libs\\gui\\ISurfaceComposerClient.cpp

      createSurface函数在BnSurfaceComposerClient的子类Client中实现

  frameworks\\native\\services\\surfaceflinger\\SurfaceFlinger.cpp

  关于SurfaceFlinger的消息队列这里不做分析。MessageCreateSurface消息被投递到SurfaceFlinger的mEventQueue队列中后,MessageCreateSurface类的handler函数被调用,用来处理MessageCreateSurface消息。

  这里又调用SurfaceFlinger的createSurface函数来创建Surface

  该函数首先根据应用程序发送过来的参数来读取请求创建Surface的类型,目前Android系统定义了4种类型的Layer,即eFXSurfaceNormal、eFXSurfaceBlur、eFXSurfaceDim、eFXSurfaceScreenshot。构造完并初始化LayerBaseClient对象,最后从LayerBaseClient对象中取得BSurface本地对象,然后将BSurface对象的远程Binder代理对象返回给应用程序。

  该函数首先判断图像格式,然后构造一个Layer对象,接着为该Layer对象设置缓冲区buffer,上图显示了Layer类的继承关系,在构造Layer对象时,其父类的构造函数会被依次调用。

  Layer的父类LayerBaseClient构造过程:

  LayerBaseClient的父类LayerBase的构造过程:

  由于Layer继承于RefBase类,同时实现了该类的onFirstRef函数,在前面就介绍了,当第一次强引用RefBase的子类对象,并且该子类对象实现了onFirstRef函数,onFirstRef函数会被自动调用,Layer对象也不例外:

  这里就是为当前创建的Layer构造并初始化SurfaceTexture对象,该SurfaceTexture对象用来管理BufferQueue。回到SurfaceFlinger的创建 普通Surface函数createNormalSurface,构造完Layer对象后,还需根据图像大小,格式来设置Layer对象中的buffer

  最后返回到SurfaceFlinger的createSurface函数设置Layer的当前状态及名称,同时将当前创建的Layer添加到Client的窗口列表及SurfaceFlinger维护的Z秩序列表中

  函数调用attachLayer将当前Layer添加到当前应用程序在SurfaceFlinger中的Client的mLayers列表中

  接着调用函数addLayer_l将当前创建的Layer添加到SurfaceFlinger中 

  完成Layer对象的创建及设置后,调用当前创建的Layer对象的getSurface()函数来创建一个BSurface对象,getSurface()函数实现在Layer的父类LayerBaseClient中

  createSurface()用于创建一个BSurface对象,同时将创建的BSurface的Binder本地对象保存到LayerBaseClient的父类LayerBase的成员变量mClientSurfaceBinder中。

  层层返回到SurfaceFlinger的createSurface函数,该函数最终返回一个BSurface对象,最后在BnSurfaceComposerClient的onTransact函数中通过writeStrongBinder(s->asBinder())将BSurface的Binder本地对象写入到Binder驱动中,应用程序端BpSurfaceComposerClient通过reply.readStrongBinder()从Binder驱动中读取BSurface的Binder远程代理对象,并通过interface_cast创建BSurface的远程代理对象BpSurface,到此Surface就创建完成了,现在来总结一下Surface的整个创建过程

  1.应用程序进程通过SurfaceComposerClient对象向SurfaceFlinger请求创建Surface;

  2.SurfaceComposerClient对象借助Client的远程代理对象BpSurfaceComposerClient向Client请求创建Surface;

  3.Client接收到BpSurfaceComposerClient的CREATE_SURFACE请求后,向SurfaceFlinger的事件队列发送MessageCreateSurface消息;

  4.MessageCreateSurface消息处理过程中,使用SurfaceFlinger来创建Surface;

  5.SurfaceFlinger根据参数创建并初始化Layer对象;

  6.创建BSurface对象,并将该对象的Binder远程对象返回给应用程序进程。

  本文详细分析了Android远程代理对象BpSurface的获取过程源码,从客户端进程和服务端进程分析BpSurfaceComposerClient向服务端的Client请求创建Surface的过程,代码图文详细分析Layer的父类LayerBaseClient构造过程。

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程