android的显示系统GUI= C语言框架+JAVA语言框架

 

libui.so是整个GUI系统的中枢,它包含颜色格式、EGL窗口(用户显示),按键及事件的处理、surface(显示界面)、overlay(显示叠加层)、camara(照相机接口)等多方面的定义;

 

Gralloc模块是显示模块的实现,它由libui调用,在FrameBufferNativeWindow.cpp中找开gralloc设备,一般是由芯片产家提供的库,不给源码,gralloc.XXXX.so

 

HAL硬件抽象层是系统层与内核层交互的部分,可以看作是用户空间的驱动程序;

 

Framebuffer是内核层中与显示相关的部分,它是linux系统中显示部分驱动程序接口;

 

surface Manager是framework 下负责管理UI显示的模块,它负责多程序显示时,管理显示与存取操作间的互动,也负责将2D绘图与3D绘图进行显示上的全盛

 

surface Flinger是显示系统中,C++部分的核心,它的作用有:

1,响应client的请求,创建layer与客户端surface连接;

2,接收client请求,修改layer的属性,如大小,透明度等;

3,维持layer的Z order序,对layer作裁剪计算;

4,将layer刷新到屏幕上。、

 

 

Android 4.0在设计时可以支持多输出屏,在surfaceFlinger上有一个graphicplane数组,就是针对多输出屏的,每个成员对应一个displayHardwared硬件。

 

从代码上看,surfaceFlinger的工作从waitforEvent(等待事件)开始----------->handleConsoleEvent(取得屏幕)------------>handleTransaction(窗口改变的状态,设置layer的标志位)--------->handlePageFlip(交换各个layer的buffer,根据Z  order计算各layer的可见区域)--------->handleRepaint(将各layer的可见区拷贝到主buffer上,由软件(openGL+pixFlinger)或者硬件(openGL+Copybit)来完成alpha、翻转等);

完成主buffer的内容更新后,将通知framebuffer去更新硬件显示:surfaceFlinger.cpp::postFramebuffer()-------->DisplayHardware.cpp::flip()------->Egl.cpp::swapBuffers()----->FramebufferNativewindow.cpp::queueBuffer()------->gralloc.cpp::fb->post()----------framgebuffer.cpp::post()---->对FB设备进行ioctl,上面的过程是针对android2.3版本的,对于4.0版本,在DisplayHardware与Egl之间加上HWCopmoser过程。

 

 

对于surface Flinger部分,包括surface申请,管理,buffer分配内在以后刷新处理是比较复杂的,需要花时间去仔细研究。

 

 

 

更多相关文章

  1. 关于android系统Binder机制解析
  2. Android(安卓)HAL模块实现
  3. Android(安卓)Hal 分析
  4. Android(安卓)Activity 中阻止自动弹出系统软键盘
  5. Android安全防护防护———Android(安卓)端常见的安全问题
  6. Android(安卓)Touch系统简介(二):实例详解onInterceptTouchEvent与
  7. 获取当前应用的版本号和当前android系统的版本号
  8. Android(安卓)ART模式简介
  9. Android(安卓)通知使用权(NotificationListenerService)的使用

随机推荐

  1. Android基础 : Android Service
  2. Android 下用 Pull 解析和生成 XML
  3. android ACodec MediaCodec NuPlayer flo
  4. Android 在线视频播放器(Vitamio)
  5. 简单的使用腾讯X5内核浏览器替代Android
  6. Android targetSdkVersion了解一下
  7. Android设备FTP服务器搭建
  8. Android短信备份
  9. [Android]网页内图片点击查看大图/识别二
  10. Android中ConvenientBanner的使用