【vc++精品源码栏目提醒】:网学会员--在 vc++精品源码编辑为广大网友搜集整理了:Android系统的开机画面显示过程分析 - 其它资料绩等信息,祝愿广大网友取得需要的信息,参考学习。
Android 系统的开机画面显示过程分析 分类: Android2012-07-09 00:56 1252人阅读 评论39 收藏 举报 好几个月都没有更新过博客了,从今天开始,老罗将尝试对 Android 系统的 UI 实现作一个系统的分析,也算是落实之前所作出的承诺。
提到 Android 系统的 UI,我们最先接触到的便是系统在启动过程中所出现的画面了。
Android 系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段。
本文将详细分析这三个开机画面的显示过程,以便可以开启我们对 Android 系统 UI 实现的分析之路。
第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面。
第二个开机画面是在 init 进程启动的过程中出现的,它也是一个静态的画面。
第三个开机画面是在系统服务启动的过程中出现的,它是一个动态的画面。
无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称 fb)的硬件设备上进行渲染的。
接下来,我们就分别分析这三个画面是如何在 fb 上显示的。
1. 第一个开机画面的显示过程 Android 系统的第一个开机画面其实是 Linux 内核的启动画面。
在默认情况下,这个画面是不会出现的,除非我们在编译内核的时候,启用以下两个编译选项: CONFIG_FRAMEBUFFER_CONSOLE CONFIG_LOGO 第一个编译选项表示内核支持帧缓冲区控制台,它对应的配置菜单项为:Device DeviceDrivers ---gt Graphics support ---gt Console display driver support ---gt Framebuffer support。
第二个编译选项表示内核在启动的过程中,需要显示 LOGO,它对应Console support的配置菜单项为:Device Drivers ---gt Graphics support ---gt Bootup logo 配置 Android logo。
内核编译选项可以参考在 Ubuntu 上下载、编译和安装 Android 最新内核源代码(LinuxKernel)一文。
帧缓冲区硬件设备在内核中有一个对应的驱动程序模块 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 10 static int __init 11 void void fbmem_initvoid 12 13 proc_createquotfbquot 0 NULL ampfb_proc_fops 14 15 if register_chrdevFB_MAJORquotfbquotampfb_fops 16 printkquotunable to get major d for fb devsnquot FB_MAJOR 17 18 fb_class class_createTHIS_MODULE quotgraphicsquot 19 if IS_ERRfb_class 20 printkKERN_WARNING quotUnable to create fb class errno ldnquot PTR_ERRfb_class 21 fb_class NULL 22 23 return 0 24 这个函数首先调用函数 proc_create 在/proc 目录下创建了一个 fb 文件,接着又调用函数 register_chrdev 来注册了一个名称为 fb 的字符设备,最后调用函数 class_create 在/sys/class 目录下创建了一个 graphics 目录,用来描述内核的图形系统。
模块 fbmem 除了会执行上述初始化工作之外,还会导出一个函数register_framebuffer: 25 EXPORT_SYMBOLregister_framebuffer 这个函数在内核的启动过程会被调用,以便用来执行注册帧缓冲区硬件设备的操作,它的实现如下所示: 26 / 27 register_framebuffer - registers a frame buffer device28 fb_info: frame buffer info structure29 30 Registers a frame buffer device fb_info.31 32 Returns negative errno on error or zero for success.33 34 /3536 int37 struct register_framebufferstruct fb_info fb_info38 39 int i40 struct fb_event event41 ......4243 if num_registered_fb FB_MAX44 return -ENXIO4546 ......4748 num_registered_fb49 for i 0 i lt FB_MAX i50 if registered_fbi51 break break52 fb_info-gtnode i53 mutex_initampfb_info-gtlock54 fb_info-gtdev device_createfb_class fb_info-gtdevice55 MKDEVFB_MAJOR i NULL quotfbdquot i56 if IS_ERRfb_info-gtdev 57 / Not fatal /58 printkKERN_WARNING quotUnable to create device for framebuffer derrno ldnquot i PTR_ERRfb_info-gtdev59 fb_info-gtdev NULL60 else61 fb_init_devicefb_info6263 ......6465 registered_fbi fb_info6667 event.info fb_info68 fb_notifier_call_chainFB_EVENT_FB_REGISTERED ampevent69 return 070 由于系统中可能会存在多个帧缓冲区硬件设备,因此,fbmem 模块使用一个数组registered_fb 保存所有已经注册了的帧缓冲区硬件设备,其中,每一个帧缓冲区硬件都是使用一个结构体 fb_info 来描述的。
我们知道,在 Linux 内核中,每一个硬件设备都有一个主设备号和一个从设备号,它们用来唯一地标识一个硬件设备。
对于帧缓冲区硬件设备来说,它们的主设备号定义为FB_MAJOR(29),而从设备号则与注册的顺序有关,它们的值依次等于0,1,2等。
每一个被注册的帧缓冲区硬件设备在/dev 目录和/sys/class/graphics 目录下都有一个对应的设备文件 fbltminorgt,其中,ltminorgt表示一个从设备号。
例如,第一个被注册的帧缓冲区硬件设备在/dev 目录和/sys/class/graphics 目录下都有一个对应的设备文件 fb0。
用户空间的应用程序通过这个设备文件就可以操作帧缓冲区硬件设备了,即将要显示的画面渲染到帧缓冲区硬件设备上去。
这个函数最后会通过调用函数 fb_notifier_call_chain 来通知帧缓冲区控制台,有一个新的帧缓冲区设备被注册到内核中来了。
帧缓冲区控制台在内核中对应的驱动程序模块为 fbcon,它实现在文件kernel/goldfish/drivers/video/console/fbconn.c 中,它的初始化函数如下所示: 71 static struct notifier_block fbcon_event_notifier 72 .notifier_call fbcon_event_notify 73 74 75 ...... 76 77 void void static int __init fb_console_initvoid 78 79 int i 80 81 acquire_console_sem 82 fb_register_clientampfbcon_event_notifier 83 fbcon_device device_createfb_class NULL MKDEV0 0 NULL 84 quotfbconquot 85 86 if IS_ERRfbcon_device 87 printkKERN_WARNING quotUnable to create device quot 88 quotfor fbcon errno ldnquot 89 PTR_ERRfbcon_device 90 fbcon_device NULL 91 else 92 fbcon_init_device 93 94 for i 0 i lt MAX_NR_CONSOLES i 95 con2fb_mapi -1 96 97 release_console_sem 98 fbcon_start 99 return 0 100 这个函数除了会调用函数 device_create 来在/sys/class/graphics 目录下创建一个fbconn 文件之外,还会调用函数 fb_register_client 来监听帧缓冲区硬件设备的注册事件,这是由函数 fbcon_event_notify 来实现的,如下所示: struct 101 static int fbcon_event_notifystruct notifier_block self 102 unsigned long action void data 103 104 struct fb_event event data 105 struct fb_info info event-gtinfo 106 ...... 107 int ret 0 108 109 ...... 110 111 switchaction switch 112 ...... 113 case FB_EVENT_FB_REGISTERED: 114 ret fb
上一篇:
图像处理毕业论文
下一篇:
电话销售英文简历范文