Android GUI系统框架介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljp1205/article/details/82284131

这个又是内部技术分享时准备的PPT,Android GUI框架是一个非常庞大的系统,也是Android最重要的系统之一,其决定了一个Android界面究竟如何显示出来,显示效果/效率怎样,也一直是Android系统优化的重点,从Android 诞生到现在,在GUI框架上Android团队做出了很多的优化努力与架构更新。这也让Android从最初时卡顿/不流畅发展到现在。

我们首先从一张最常见的界面图开始,这张图是我自己在写这个PPT的时候从我个人的手机里截图出来的,这其实就是一个最常见的Launcher界面,而在这个界面当中,一共有三个窗口界面,分别是最上面的状态栏,占据大部分显示界面的的Launcher显示窗口以及壁纸窗口,而壁纸窗口与Launcher窗口重叠的,而两窗口之间肯定是通过alpha混合在一起的,这样两个窗口都能看到。
这里写图片描述

在上一页里咱们看到的一个界面上有多个窗口,那么这些窗口是怎么管理,合成,显示的呢?这个其实就是这个PPT里要介绍。
在Android 系统里,整个架构是采用C/S的架构,整个Android系统里有各种的系统服务,负责管理各个子系统,而负责窗口相关的WindowsManagerService,简称是WMS,即窗口管理服务器,在WMS里基本会管理如下几种窗口:

  1. 应用程序窗口
  2. 应用程序的子窗口(对话框/Toast/上下文菜单/菜单项/)
  3. 系统窗口(关机窗口/状态栏/导航栏 等等)

这里写图片描述

WMS针对这些窗口采用Z-Order的方式管理,每个窗口都有自己的Z-Order值,每种窗口类型的Z-order值的区间都不太一样。

这里写图片描述
WMS只负责处理窗口的逻辑数据,如窗口大小,位置,z-order值等等,窗口显示内容的buffer还是得由SurfaceFlinger来处理。具体来说,SF中会采用一个Layer的对象里对应WMS中的每一个窗口,这个Layer会创建一个BufferQueue来负责分配显示buffer,目前默认是分别三个buffer,这也就是triple buffer机制。而BufferQueue具体则通过Gralloc模块来完成对显示buffer的申请。Buffer的传递则通过
SF—->WMS—–>应用的途径传递到应用当中,而当应用拿到之后可以直接从Gralloc中映射出显示buffer来。

这里写图片描述
在这里,我们来讨论下应用拿到显示buffer之后的具体绘制方式,在当前android 系统提供了两种绘制接口,分别是基于SDK API接口的绘制跟基于OpenGL/EGL API接口的绘制,前者主要针对普通应用,而后者主要针对的是游戏,视频相关的应用。
而基于SDK API接口的绘制,实现方式又分两种,分别是由libskia实现的software renderer跟采用gpu渲染的hardware renderer。libskia是一个C库,由CPU完成在显示内存上的渲染工作,而hardware render则由gpu来完成,成倍的提升了渲染效率。

这里写图片描述
应用通过渲染器把自己的界面渲染到显示内存中,这还不意味着显示工作的结束,它还需要将显示内存送到SurfaceFlinger当中,在这个过程当中,应用充当的是显示内存的生产者,而SurfaceFlinger则是显示内存的消费者。生产者生产的显示内容源源不断的送到消费者的嘴边,消费者不断的消费掉。

这里写图片描述
当多个窗口程序在不断生产显示buffer的时候,作为消费者的SurfaceFlinger会怎么消费这些显示buffer呢?毕竟一个手机里,屏幕只有一个,SurfceFlinger需要把这些显示buffer都合成起来,Surceflinger在合成的时候有一个好帮手,这就是HWC,这是hardware compositor的缩写,从名字上看就知道是干嘛的。
一般工作流程会是这样的:SurfaceFlinger在每次开工的时候,都会来主动咨询下HWC:嗨,老兄,这些窗口你能帮我搞定哪些啊?HWC会回复:我能搞定这个,这个,还有这个。SF看看,好像需要自己搞定的不算多哎,这个工作还不错嘛,然后就把HWC说自己能搞定的都直接丢给了HWC,自己来负责剩余的界面合成,当然SF也不会自己让CPU来干活的,它还是会把GPU拉过来干活,会合成一张图,然后丢给HWC,HWC把这一张图跟之前答应过SurfaceFlinger要负责的窗口合在一起最后成一张图丢到显示器。
SurfaceFlinger在干活的时候,充当的是生产者,而HWC这个时候就是一个消费者。

这里写图片描述
HWC的代码很多芯片公司都是有自己的实现,而且很多代码别说开源了,连release给OEM/ODM厂家都不会,这张图主要是拿着Intel开源的HWC以及LINUX KERNEL里DRM 显示框架给一个大致的介绍。

这里写图片描述
VSYNC是目前Android GUI系统里最重要的概念,一切跟绘制相关的动作均是由VSYNC事件来驱动,vsync的来源是显示器的刷新机制,一般的显示器也是定期刷新的,比如一秒30次,60次,120次的刷新次数。在目前ANDROID系统当中,应用的绘制,SurfaceFlinger的合成,显示器的刷新均是有vsync来驱动,

这里写图片描述

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/ljp1205/article/details/82284131