Android系统的开机画面显示过程分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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}

相关文档
最新文档