三个开机画面:
第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面。
第二个开机画面是在init进程启动的过程中出现的,它也是一个静态的画面。
第三个开机画面是在系统服务启动的过程中出现的,它是一个动态的画面。
可视分辨率是屏幕实际上使用的分辨率,即用户所看到的分辨率,而虚拟分辨率是在系统内部使用的,它是不可见的,并且可以大于可视分辨率。
通过这个三个开机画面的显示过程分析,我们学习到:
1. 在内核层,系统屏幕是使用一个称为帧缓冲区的硬件设备来描述的,而用户空间的应用程序可以通过设备文件/dev/fb0或者/dev/graphics/fb0来操作这个硬件设备。实际上,帧缓冲区本身并不是一个真正的硬件,它只不过是对显卡的一个抽象表示,不过,我们通过访帧缓冲区就可以间接地操作显卡内存以及显卡中的其它寄存器。
2. OpenGL是通过EGL接口来渲染屏幕,而EGL接口是通过ANativeWindow类来间接地渲染屏幕的。我们可以将ANativeWindow类理解成一个Android系统的本地窗口类,即相当于是Windows系统中的窗口句柄概念,它最终是通过文件/dev/fb0或者/dev/graphics/fb0来渲染屏幕的。
3. init进程在启动的过程中,会将另外一个ueventd进程也启动起来。ueventd进程对应的可执行文件与init进程对应的可执行文件均为/init,不过ueventd进程主要负责处理内核发出的uevent事件,即负责管理系统中的设备文件。
4. 每当我们设置一个系统属性的时候,init进程都会接收到一个系统属性变化事件。当发生变化的系统属性的名称等于“ctl.start”或者“ctl.stop”,那么实际上是向init进程发出一个启动或者停止服务的命令。
- Gralloc模块
显示屏被抽象为一个帧缓冲区;
SurfaceFlinger服务通过向这个帧缓冲区写入内容来绘制应用程序的用户界面;
Gralloc模块,封装了对帧缓冲区的所有访问操作。
1.Gralloc模块的加载过程
hw_get_module:以ID值为参数将指定的模块加载到内存,并且获得一个hw_module_t接口来打开相应的设备。
2. gralloc设备的打开过程
3. fb设备的打开过程
4. 分配图形缓冲区
5. 图形缓冲区的释放过程
6. 图形缓冲区的注册过程
7. 图形缓冲区的注销过程
8. 图形缓冲区的渲染过程
为了在屏幕中绘制一个指定的画面:
1. 分配一个匹配屏幕大小的图形缓冲区
2. 将分配好的图形缓冲区注册(映射)到当前进程的地址空间来
3. 将要绘制的画面的内容写入到已经注册好的图形缓冲区中去,并且渲染(拷贝)到系统帧缓冲区中去
为了实现以上三个操作,我们还需要:
1. 加载Gralloc模块
2. 打开Gralloc模块中的gralloc设备和fb设备
其中,gralloc设备负责分配图形缓冲区,Gralloc模块负责注册图形缓冲区,而fb设备负责渲染图形缓冲区