关于android显示子系统的认识之一
在网上有很多经典的教程,说android显示,
自己写出来,只是想沉淀一下自己的项目中的经历,
或者是说说自己的一家一言,如果你发现我的思路有瑕疵,或有更好的想法表述,请告诉我哈。
 
版本以:android 2.2 为例
         关于架构,一句话, 无处不在的层的思想。
看了那张经典的狗狗出的android架构图,我认为不过:
App -->framework --> 库 (静态库,动态库)-->HAL-->KERNEL
做开发,弄懂前2层,
如果做移植,至少后两层,多则整个数据流都要懂。
 
就拿显示子系统来说:
APP-->framework-->surfaceFlinger-->HAL (GRALLOC)
      -->frambuffer drvier(接口)-->显卡驱动-->LCD驱动
 
 
关于android显示子系统的认识之2
关键词 :framebuffer, HAL
 
先说framebuffer帧缓冲。
用这个驱动接口,coder不用关心显存具体的硬件位置,换页.
 
还有framebuffer设备其实是一个字符设备。
因此我们可以用 read ,write ,mmap等io操作控制他,还有ioctl,这个操作可以用来获取固定参数,比如屏幕大小、分辨率,比如设置屏幕的rgb格式。
 
framebuffer最重要的数据结构有3个,
frame_fix_screeninfo frame_var_screeninfo fb_info //fb.h中定义
 
前两个,一个用于获取固定的硬件信息,另外一个设置可变的。话说回来,那些ioctl操作其实就是给这些数据结构打交道的。
最后fb_info这个只能被内核访问,用来具体执行各种操作。
 
 
再说第二个关键词: HAL.
话说弄出这个抽象层,是各个厂商为了保护自己的知识财产。
我最直接的感受是:
显示系统的HAL的主要功能函数都是动态库加载的, 关于hal其他之处,暂时没有特别的感受。
 关于android显示子系统的认识之3
关键词:刷屏操作。
 
这里刷屏,我没有分开说 是 文字,是bitmap,还 是矩形。
其实很多显示系统上,我看到的,对于单独的矩形,文字,有更好的优化。
 
1)打开 设备 , /dev/fb    (android下是/dev/graphic/fb0)
2)用ioctl获取屏幕参数,分辨率等,由得到参数可以计算显存大小(其实是屏幕大小的2倍)
3)将缓冲区映射到用户空间//mmap
4)直接读写帧缓冲区
 
代码位置:android2.2这个部分主要在 fb_post函数中 (散落在gralloc中)
 关于android显示子系统的认识之4-浅谈Surfaceflinger
 
Surfaceflinger ,位置是framework以下,libraries中
作用是:对屏幕上的多个应用程序(准确是surface) 管理显示、存取和互动操作,还要管理2d、3d的合成。
 
具体到管理对象,每一个程序对应一个surface
//其实anroid外,stlinux中的显示系统对应的有layer,其实我感觉就是一图层罢了。
 
说到surface,不得不提到双缓冲,其实双缓冲指的是
一个surface,2个buffer,分别是front,back,用户看到的是front,当有数据更新时,写道back,需要显示时,front,end交换就是。
 
再补充一点,所有的app与surfaceflinger如何通信,答曰binder,其实这是典型的c/s架构,surfacefinger相当于其中的server,而每个app都是client.
 
如上,是我对surfaceflinger的理解,感觉很浅,只是说到表面,当感觉对于理清楚app与Surfaceflinger 的关系,八九不离十了吧。
 
 
关于android显示子系统的认识之5-gralloc
关于gralloc,我认为这是framebuffer刷到显示设备的过程。这里面抽象、联系的东西比较多,就下次说吧。
(待补充)
好的资料给上:
参考了
大名鼎鼎的 android核心分析