Android Surface系统的实现

发布时间:2013-11-19 20:06:25   来源:文档文库   
字号:

Android Surface系统实现

梁铁

杭州海康威视数字技术股份有限公司 浙江省杭州市310052

摘要:

安卓的图形显示系统负责应用用户界面窗口的绘制安卓系统中一个重要且复杂的模块窗口管理服务图形混合服务图形显示系统的核心服务,通过分析二者的工作流程了解安卓图形显示系统起到很大的帮助

关键

安卓系统图形显示系统图形混合系统窗口管理服务

Android Surface Realization

Liangtie

Hikvision Digital Technology Co., Ltd

HangzhouZhejiang Province 310052

Abstract:

Android surface system is responsible for drawing the User Interface Window of android application, its a very complicate and important module in the android system. WindowManagerService and SurfaceFlinger service are the key services in the Android Surface System. To analyze these services work flow is very important to understand the android surface system.

Keywords:

AndroidSurfaceSurfaceFlingerWindowManagerService

正文:

Android图形显示

Android应用通常由一个或多个基本组件组成,Activity是负责应用与用户交互的组件,内部包括Window窗口图1是Android应用和Surface系统交互的流程框图,通过一系列的操作步骤,ActivityWMSSurfaceFlinger之间的关系进行初步的展示

1) 系统启动一个新的Activity

2) WMSActivity创建一个Phone Window类型的窗口, 注册到WMS

3) SurfaceFlingerSurface分配资源,通过共享内存的方式,与应用共同操作Surface数据缓冲区

4) 应用Surface上绘制UI窗口的全部视图

5) SurfaceFlinger把全部应用的Surface图形数据混合起来进行显示输出

通过对一个Android应用Activity图形显示流程的分析,掌握Surface架构的运行机制,有很大帮助

1 Surface流程示意图

WindowManagerService (WMS)

WMS是由System_Server进程启动的,负责应用程序窗口的创建、控制和管理等工作,并完成系统消息的收集和分发工作。如图2所示。应用请求创建窗口时,和应用直接交互的是WindowManagerImpl对象,它会创建一个ViewRoot负责与WMS的交互

IWindowSessionIWindow是标准的aidl接口,用于ViewRootWMS之间的交互。其中,IWindowSession接口用于ViewRootWMS内部类Session进行跨进程通信IWindow接口用于WMS调用ViewRoot内部的W 类,完成派发按键消息功能。

WMS创建一个SurfaceComposerClient对象与窗口对应它是与SurfaceFlinger服务进行交互的接口

word/media/image2.gif

2. ActivityWMS交互示意图

SurfaceFlinger

SurfaceFlinger是由System_Server进程启动系统服务进程,它负责分配和管理Surface图形显示系统需要的资源,并完成SurfaceCompose图形混合的工作用于显示

如图3所示,SurfaceFlinger服务创建Layer对象对应ActivitySurface按照Z轴顺序进行管理。SurfaceFlinger通过调用Android定义的显示设备HALDisplayHardware,为Layer分配GraphicBuffer显示缓冲区。一般为一个Layer分配两个GraphicBuffer,方便进行PageFlipping显示操作(FrontBuf用于输出,BackBuf用于绘制)

SurfaceFlinger服务每个SurfaceComposerClient创建Client类对象Client对象里面包括一个创建在共享缓冲区上的SharedClient对象ActivitySurfaceFlinger通过这个对象实现对GraphicsBuffer的访问同步。

SharedClient31SharedBufStack用来管理GraphicBuffer,因此每个Activity最多可以支持31Surface图层显示

word/media/image3.gif

3. SurfaceFlinger显示层管理

Activity Surface视图绘制

应用通过调用以下三步骤,完成UI窗口视图的绘制:

1) LockCanvas,获取并锁定Surface对应的GraphicsBuf中的BackBuffer,与Canvas绑定,用来存储Surface图形内容。

2) 图形绘制。Canvas类封装了图形绘制函数,通过调用这些功能函数可以完成视图绘制的工作。若系统支持GPU硬件加速,则使用GPU完成视图绘制工作,否则ARM完成相关的工作。

3) unlockCanvasAndPost,解除BackBuffer锁定,完成PageFlipBackBufferFrontBuffer交换), 发送信号给SurfaceFlinger,进行SurfaceCompose工作

word/media/image4.gif4. Surface绘制调用过程图

SurfaceFlinger Surface Compose

SurfaceFlinger系统服务进行Surface Compose工作流程,如图5所示。

1. 等待事务处理或等待重绘事件。

2. 如果有事务请求,则进行事务处理。比如窗口90度旋转操作等

3. 各个LayerGraphicBuffer中的FrontBuffer获取新数据,并生成一张OpenGL中的纹理信息。

4. 按照Zorder设置顺序,利用OpenGL接口绘制每个LAYER的纹理信息。

5. 遍历各个显示层的finishPageFlip函数,释放FrontBuffer

6. Surface Compose后的图像用来显示。

word/media/image5.gif

5 SurfaceFlinger工作流程

android surface系统中,WindowManagerService服务实现系统对应用activity窗口管理和消息派发等功能,SurfaceFlinger服务实现系统显示资源管理和应用图形统一绘制、输出功能。

参考文献:

[1] 邓凡平.深入理解Android:卷Ι.北京:机械工业出版社,2011.9

[2] 金泰延 宋亨周 朴知勋等.Android框架解密 北京:人民邮电出版社 2012.4

[3] 李刚. 疯狂Android讲义. 北京:电子工业出版社.2011.7

本文来源:https://www.2haoxitong.net/k/doc/089ca4f67f1922791688e8b2.html

《Android Surface系统的实现.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式