Android系统的开机画面显示过程分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android系统的开机画面显示过程分析
分类:Android2012-07-0900:561252人阅读评论(39)收藏举报
好几个月都没有更新过博客了,从今天开始,老罗将尝试对Android系统的UI实现作一个系统的分析,也算是落实之前所作出的承诺。提到Android系统的UI,我们最先接触到的便是系统在启动过程中所出现的画面了。Android系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段。本文将详细分析这三个开机画面的显示过程,以便可以开启我们对Android系统UI实现的分析之路。
第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面。第二个开机画面是在init进程启动的过程中出现的,它也是一个静态的画面。第三个开机画面是在系统服务启动的过程中出现的,它是一个动态的画面。无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的。接下来,我们就分别分析这三个画面是如何在fb上显示的。
1.第一个开机画面的显示过程
Android系统的第一个开机画面其实是Linux内核的启动画面。在默认情况下,这个画面是不会出现的,除非我们在编译内核的时候,启用以下两个编译选项:
CONFIG_FRAMEBUFFER_CONSOLE
CONFIG_LOGO
第一个编译选项表示内核支持帧缓冲区控制台,它对应的配置菜单项为:Device Drivers--->Graphics support--->Console display driver support--->Framebuffer Console support。第二个编译选项表示内核在启动的过程中,需要显示LOGO,它对应的配置菜单项为:Device Drivers--->Graphics support--->Bootup logo。配置Android 内核编译选项可以参考在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)一文。
帧缓冲区硬件设备在内核中有一个对应的驱动程序模块fbmem,它实现在文件kernel/goldfish/drivers/video/fbmem.c中,它的初始化函数如下所示:
1/**
2*fbmem_init-init frame buffer subsystem
3*
4*Initialize the frame buffer subsystem.
5*
6*NOTE:This function is_only_to be called by drivers/char/mem.c.
7*
8*/
9
10static int__init
11fbmem_init(void)
12{
13proc_create("fb",0,NULL,&fb_proc_fops);
14
15if(register_chrdev(FB_MAJOR,"fb",&fb_fops))
16printk("unable to get major%d for fb devs\n",FB_MAJOR);
17
18fb_class=class_create(THIS_MODULE,"graphics");
19if(IS_ERR(fb_class)){
20printk(KERN_WARNING"Unable to create fb class;errno=%ld\n", PTR_ERR(fb_class));
21fb_class=NULL;
22}
23return0;
24}
这个函数首先调用函数proc_create在/proc目录下创建了一个fb文件,接着又调用函数register_chrdev来注册了一个名称为fb的字符设备,最后调用函数class_create在/sys/class目录下创建了一个graphics目录,用来描述内核的图形系统。
模块fbmem除了会执行上述初始化工作之外,还会导出一个函数
register_framebuffer:
25EXPORT_SYMBOL(register_framebuffer);
这个函数在内核的启动过程会被调用,以便用来执行注册帧缓冲区硬件设备的操作,它的实现如下所示:
26/**
27*register_framebuffer-registers a frame buffer device
28*@fb_info:frame buffer info structure
29*
30*Registers a frame buffer device@fb_info.
31*
32*Returns negative errno on error,or zero for success.
33*
34*/
35
36int
37register_framebuffer(struct fb_info*fb_info)
38{
39int i;
40struct fb_event event;
41......
42
43if(num_registered_fb==FB_MAX)
44return-ENXIO;
45
46......
47
48num_registered_fb++;
49for(i=0;i 50if(!registered_fb[i]) 51break; 52fb_info->node=i; 53mutex_init(&fb_info->lock); 54fb_info->dev=device_create(fb_class,fb_info->device, 55MKDEV(FB_MAJOR,i),NULL,"fb%d",i); 56if(IS_ERR(fb_info->dev)){ 57/*Not fatal*/ 58printk(KERN_WARNING"Unable to create device for framebuffer%d; errno=%ld\n",i,PTR_ERR(fb_info->dev)); 59fb_info->dev=NULL; 60}else 61fb_init_device(fb_info); 62 63...... 64 65registered_fb[i]=fb_info; 66 =fb_info; 68fb_notifier_call_chain(FB_EVENT_FB_REGISTERED,&event); 69return0; 70}