现在的位置: 首页 > 综合 > 正文

Android开机启动分析(一)logo的显示

2013年08月09日 ⁄ 综合 ⁄ 共 3506字 ⁄ 字号 评论关闭

Android开机启动的时候会有一个logo出现,它对应的源代码位于/system/core/init/目录下的logo.c中:

下面是我注释过的代码:

分析如下:

Android开机的第一个进程为init,在它的实现文件,即init.c中,会通过调用函数load_565rle_image(INIT_IMAGE_FILE)来实现开机启动显示logo的。而上述这个函数是在同目录下的logo.c中实现的。

在load_565rle_image()这个主函数中先调用vt_set_mode()来设定终端的显示方式,默认是使用终端的graphics显示方式,通过对开/dev/tty0设备文件调用ioctl系统调用来设定,但是如果不能打开load_565rle_image(INIT_IMAGE_FILE)中指定的INIT_IMAGE_FILE图片文件时,就直接将/dev/tty0设置为Text显示模式,然后直接返回,执行init.c中后面的代码(直接向/dev/tty0设备写入"Android"字样的logo,这也就是默认的启动logo,很没有创意,哈哈!)

但是如果存在INIT_IMAGE_FILE这个图片文件的话,就会在load_565rle_image中通过调用mmap,将图片文件映射到当前进程的存储空间中,接着就又调用fb_open()函数来打开linux framebuufer对应的设备文件 /dev/graphics/fb0 ,并把framebuffer也通过mmap映射到存储空间,于是就在后面调用android_memset16()来写入图片,从android_memset16()这样函数的参数就可以看出,程序的目的就是要把ptr对应的图片存储空间地址所对应的字节,写到bits对应的framebuffer对应的存储空间中。写Framebuffer具体细节就不追究了,可能牵涉到Framebuffer原理的一些知识。

 

而在init.h文件中:

#define INIT_IMAGE_FILE "/initlogo.rle"

说明了图片文件的位置和默认的文件名,这样就可以自定义开机显示画面了,哈哈!!!

 

总结:显示开机logo,如果使用图片的话就是通过mmap,将图片内容写到Framebuffer存储映射空间来完成的;而如果只是显示Text的话,就是直接和/dev/tty0打交道了。分析完毕!!

 

 

【上篇】
【下篇】

抱歉!评论已关闭.