ANDROIDSURFACE(androidsurfaceflinger)

http://www.itjxue.com  2023-02-20 08:40  来源:未知  点击次数: 

Android系统_Surface创建过程分析

WMS添加window过程,最后会执行到session.windowAddedLocked

创建 SurfaceSession 对象,并将当前 Session 添加到 WMS.mSessions 成员变量

SurfaceSession 的创建会调用 JNI,在 JNI 调用 nativeCreate()

构造了一个SurfaceComposerClient对象。并返回它的指针。这个对象一个应用程序就有一个,它是应用程序与SurfaceFlinger沟通的桥梁

通过SurfaceFlinger创造了一个Client对象,每一个APP都有一个Client对象向对应,通过这个代理对象可以跟SurfaceFlinger通信

构造了一个Client对象,Client实现了ISurfaceComposerClient接口。是一个可以跨进程通信的aidl对象。除此之外它还可以创建Surface,并且维护一个应用程序的所有Layer

一个ViewRootImpl就对应一个Surface

直接看ViewRootImpl的绘制流程

winAnimator.createSurfaceLocked实际上是创建了一个SurfaceControl。即上面是先构造SurfaceControl,然后在构造Surface

通过SurfaceControl的构造函数创建了一个SurfaceControl对象,这个对象的作用其实就是负责维护Surface,Surface其实也是由这个对象负责创建的

创建时传入了一个对象 spIGraphicBufferProducer gbp, 后面会说吗应用所渲染的每一帧,实际上都会添加到IGraphicBufferProducer中,来等待SurfaceFlinger的渲染

Client将应用程序创建Surface的请求转换为异步消息投递到SurfaceFlinger的消息队列中,将创建Surface的任务转交给SurfaceFlinger,因为同一时刻可以有多个应用程序请求SurfaceFlinger为其创建Surface,通过消息队列可以实现请求排队,然后SurfaceFlinger依次为应用程序创建Surface

该函数中根据flag创建不同的Layer,Layer用于标示一个图层。

除了SurfaceFlinger需要统一管理系统中创建的所有Layer对象外,专门为每个应用程序进程服务的Client也需要统一管理当前应用程序进程所创建的Layer,因此在addClientLayer函数里还会通过Client::attachLayer将创建的Layer和该类对应的handle以键值对的方式保存到Client的成员变量mLayers表中

SurfaceFlinger为应用程序创建好Layer后,需要统一管理这些Layer对象,因此通过函数addClientLayer将创建的Layer保存到当前State的Z秩序列表layersSortedByZ中,同时将这个Layer所对应的IGraphicBufferProducer本地Binder对象gbp保存到SurfaceFlinger的成员变量mGraphicBufferProducerList中

上面完成了 surfaceController的创建跟踪,下面分析从surfaceController获取surface过程

JNI构建方法获取到一个指针,

创建一个native层的Surface对象,并将该对象指针返回给Java层的Surface,从而建立Java层的Surface和native层Surface的关联关系

另外Surface和SurfaceControl都持有mGraphicBufferProducer用于操作位于SurfaceFlinger中的图形buffer

推荐阅读: 图形系统总结

android surfacecreated怎么用

surfaceCreated(SurfaceHolder holder):当Surface第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Surface。 surfaceChanged(SurfaceHolder holder, int format, int width,int height):当Surface的状态(大小和格式)发生变化的时候会调用该函数,在surfaceCreated调用后该函数至少会被调用一次。 surfaceDestroyed(SurfaceHolder holder):当Surface被摧毁前会调用该函数,该函数被调用后就不能继续使用Surface了,一般在该函数中来清理使用的资源。

如何在surface上运行安卓应用

可以在surface上使用夜神模拟器运行安卓应用。

安卓模拟器是在windows系统上可以运行的模拟安卓系统的应用,在此应用中可以安装安卓游戏或应用进行使用。

之所以推荐夜神的原因是因为夜神支持多点触控操作,而且surface是支持触屏操作的,能够带来优秀的操作体验,且针对触屏操作优化过设置按钮,可以正常的使用。

安装方法较为简单,可以百度中搜索夜神,找到带有官网的链接,点击进入,直接下载安装包到电脑中,点选安装即可正常使用。

(责任编辑:IT教学网)

更多

相关广告特效文章

推荐广告特效文章