Andorid UI架构(一)--FrameBuffer&Gralloc.md

参考资料

  1. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析
  2. FrameBuffer驱动程序分析
  3. Android图形显示之硬件抽象层Gralloc

对驱动层不了解,主要是看上面的博客,顺便总结下。
Android系统作为一个linux内核操作系统,其底层显示架构自然也是采用linux一套。一直很好奇Android应用程序是如何将自己显示到物理显示屏上的,直到了解了FrameBuffer驱动才算初步解惑。

一、帧缓冲区FrameBuffer的驱动程序分析

FrameBuffer通常作为LCD控制器或者其他显示设备的驱动,FrameBuffer驱动是一个字符设备,设备节点是/dev/fbX,主设备号为29,次设备号递增,用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。
物理显存的位置、换页机制等等具体细节都是由Framebuffer设备驱动来完成的。Framebuffer设备为上层应用程序提供系统调用,也为下一层的特定硬件驱动提供接口;那些底层硬件驱动需要用到这儿的接口来向系统内核注册它们自己。
Andorid UI架构(一)--FrameBuffer&Gralloc.md

至于驱动的实现,后续分析。这里只要明白一点:Linux系统的上层就可以像操作文件一样,通过调用对应的FrameBuffer接口直接操作显示内存

二、Android图形显示之硬件抽象层Gralloc

作为使用Linux内核的操作系统,Android系统中,每个显示屏(一般是一个)对应一个帧缓冲区,注册到FrameBuffer模块中,并在/dev/graphics目录下创建对应的fbX设备。Android系统在硬件抽象层中提供了一个Gralloc模块,封装了对帧缓冲区的所有访问操作。

  1. 用户空间的应用程序在操作FrameBuffer之前先加载Gralloc模块,获取gralloc设备和fb设备
  2. 用户空间的应用程序可以通过gralloc设备申请分配一块图形缓冲区(GraphicBuffer),并将其映射到应用程序的地址空间,这样应用程序即可向其中写入要绘制的画面。当应用程序不需要图形缓冲区时,也是通过gralloc设备释放它。
  3. 当用户空间已经向图形缓冲区写入绘制画面后,就可以通过fb设备将图形缓冲区(GraphicBuffer)渲染(其实就是拷贝)到帧缓冲区(FrameBuffer)中,进而显示到物理显示屏上。

大致如下图:

Andorid UI架构(一)--FrameBuffer&Gralloc.md

三. SurfaceFlinger, App 和 Ashmem

Andorid UI架构(一)--FrameBuffer&Gralloc.md
简化过程就是:
Andorid UI架构(一)--FrameBuffer&Gralloc.md