梁铁
杭州海康威视数字技术股份有限公司 浙江省杭州市310052
安卓的图形显示系统负责应用用户界面窗口的绘制,它是安卓系统中一个重要且复杂的模块。窗口管理服务和图形混合服务是图形显示系统的核心服务,通过分析二者的工作流程对了解安卓图形显示系统起到很大的帮助。
安卓系统、图形显示系统、图形混合系统、窗口管理服务
Liangtie
Hikvision Digital Technology Co., Ltd
Hangzhou,Zhejiang Province, 310052
Abstract:
Android surface system is responsible for drawing the User Interface Window of android application, it’s 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:
Android、Surface、SurfaceFlinger、WindowManagerService
Android应用通常由一个或多个基本组件组成,Activity是负责应用与用户交互的组件,内部包括Window窗口。图1是Android应用和Surface系统交互的流程框图,通过一系列的操作步骤,对Activity和WMS、SurfaceFlinger之间的关系进行初步的展示
1) 系统启动一个新的Activity。
2) WMS为Activity创建一个Phone Window类型的窗口, 并注册到WMS。
3) SurfaceFlinger为Surface分配资源,通过共享内存的方式,与应用共同操作Surface数据缓冲区。
4) 应用在Surface上绘制UI窗口的全部视图。
5) SurfaceFlinger把全部应用的Surface图形数据混合起来进行显示输出。
通过对一个Android应用Activity图形显示流程的分析,对掌握Surface架构的运行机制,有很大的帮助。
图1 Surface流程示意图
WMS是由System_Server进程启动的,负责应用程序窗口的创建、控制和管理等工作,并完成系统消息的收集和分发工作。如图2所示。应用请求创建窗口时,和应用直接交互的是WindowManagerImpl对象,它会创建一个ViewRoot类负责与WMS的交互。
IWindowSession和IWindow是标准的aidl接口,用于ViewRoot和WMS之间的交互。其中,IWindowSession接口用于ViewRoot与WMS内部类Session进行跨进程通信。IWindow接口用于WMS调用ViewRoot内部的W 类,完成派发按键消息等功能。
WMS会创建一个SurfaceComposerClient对象与窗口对应,它是与SurfaceFlinger服务进行交互的接口。
word/media/image2.gif
图2. Activity与WMS交互示意图
SurfaceFlinger也是由System_Server进程启动系统服务进程,它负责分配和管理Surface图形显示系统需要的资源,并完成SurfaceCompose图形混合的工作用于显示。
如图3所示,SurfaceFlinger服务创建Layer对象对应Activity的Surface,并按照Z轴顺序进行管理。SurfaceFlinger通过调用Android定义的显示设备HAL层DisplayHardware,为Layer分配GraphicBuffer显示缓冲区。一般为一个Layer分配两个GraphicBuffer,方便进行PageFlipping显示操作(FrontBuf用于输出,BackBuf用于绘制)。
SurfaceFlinger服务为每个SurfaceComposerClient创建Client类对象。Client对象里面包括一个创建在共享缓冲区上的SharedClient对象。Activity和SurfaceFlinger通过这个对象实现对GraphicsBuffer的访问同步。
SharedClient有31个SharedBufStack对用来管理GraphicBuffer,因此每个Activity最多可以支持31个Surface图层显示。
word/media/image3.gif
图3. SurfaceFlinger显示层管理
应用通过调用以下三步骤,完成UI窗口视图的绘制:
1) LockCanvas,获取并锁定Surface对应的GraphicsBuf中的BackBuffer,与Canvas绑定,用来存储Surface图形内容。
2) 图形绘制。Canvas类封装了图形绘制函数,通过调用这些功能函数可以完成视图绘制的工作。若系统支持GPU硬件加速,则使用GPU完成视图绘制工作,否则ARM完成相关的工作。
3) unlockCanvasAndPost,解除BackBuffer锁定,完成PageFlip(BackBuffer和FrontBuffer交换), 发送信号给SurfaceFlinger,进行SurfaceCompose工作。
word/media/image4.gif图4. Surface绘制调用过程图
SurfaceFlinger系统服务进行Surface Compose的工作流程,如图5所示。
1. 等待事务处理或等待重绘事件。
2. 如果有事务请求,则进行事务处理。比如窗口90度旋转操作等。
3. 各个Layer从GraphicBuffer中的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
文档为doc格式