Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

参考:Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

一句话概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlinger服务把经过测量、布局和绘制后的Surface渲染到显示屏幕上。

 postFramebuffer

SurfaceFlinger类的成员函数postFramebuffer用来将系统的主显示屏的内容渲染到硬件帧缓冲区中去,它的执行过程如图11所示:

Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

图11 SurfaceFlinger服务渲染系统主显示屏的内容到硬件帧缓冲区的过程

这个过程可以划分为4步骤,接下来我们就详细分析每一个步骤。

Step 1. SurfaceFlinger.postFramebuffer

  1. void SurfaceFlinger::postFramebuffer()
  2. {
  3. if (!mInvalidRegion.isEmpty()) {
  4. const DisplayHardware& hw(graphicPlane(0).displayHardware());
  5. const nsecs_t now = systemTime();
  6. mDebugInSwapBuffers = now;
  7. hw.flip(mInvalidRegion);
  8. mLastSwapBufferTime = systemTime() - now;
  9. mDebugInSwapBuffers = 0;
  10. mInvalidRegion.clear();
  11. }
  12. }

这个函数定义在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

在前面第4部分内容的Step 1中提到,SurfaceFlinger类的成员变量mInvalidRegion用来描述系统主显示屏的脏区域,即SurfaceFlinger服务当前需要渲染的区域。函数首先得到用来描述系统主显示屏的一个DisplayHardware对象hw,接着再调用这个DisplayHardware对象hw的成员函数flip来渲染这个脏区域。

接下来,我们就继续分析DisplayHardware类的成员函数flip的实现。

Step 2.  DisplayHardware.flip

这个函数定义在文件frameworks/base/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp中,在前面Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析一文中,我们已经分析过它的实现了。这个函数会检查系统是否支持部分更新功能。如果支持的话,那么就先设置要更新的区域,否则的话,就直接调用函数eglSwapBuffers来将前面已经合成好的了图形缓冲区渲染到硬件帧缓冲区去。

从前面Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析一文可以知道,调用函数eglSwapBuffers在渲染图形缓冲区的时候,会导致FramebufferNativeWindow类的成员函数queueBuffer被调用,后者会通过HAL层的Gralloc模块来执行渲染硬件帧缓冲区的操作。

Step 3. FramebufferNativeWindow.queueBuffer

这个函数定义在文件frameworks/base/libs/ui/FramebufferNativeWindow.cpp中,同样,在前面Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析一文中,我们已经分析过它的实现了。这个函数主要就是通过HAL层的Gralloc模块中的framebuffer_device_t设备的成员函数post来执行渲染硬件帧缓冲区的操作。

Step 4. framebuffer_device_t.post

这个函数指向定义在HAL层的Gralloc模块中的函数fb_post,后者定义在文件hardware/libhardware/modules/gralloc/framebuffer.cpp,在前面Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析一文中,我们已经分析过这个函数的实现了。由于要渲染的图形缓冲区是用于渲染系统主显示屏的,因此,它是直接在硬件帧缓冲区上分配的,这时候函数fb_post就会通过IO控制命令FBIOPUT_VSCREENINFO来通知位于内核空间的fb驱动来将系统主显示屏的UI绘制出来。

至此,SurfaceFlinger服务渲染系统主显示屏的内容到硬件帧缓冲区的过程就分析完成了,整个SurfaceFlinger服务渲染应用程序UI的过程也分析完成了。

这样,我们就通过Android应用程序与SurfaceFlinger服务的关系概述和学习计划Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划这两个系列的文章系统地分析了Android系统的SurfaceFlinger服务的实现,为后面我们后面进一步分析Android系统的UI架构打下坚实的基础!

上一篇:20155312 张竞予 Exp6 信息搜集与漏洞扫描


下一篇:oracle 10g下范围分区扫描的几种方式