好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

android系统的开机画面显示过程分析.pdf

61页
  • 卖家[上传人]:xzh****18
  • 文档编号:44567324
  • 上传时间:2018-06-14
  • 文档格式:PDF
  • 文档大小:598.06KB
  • / 61 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 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_CONSOLECONFIG_FRAMEBUFFER_CONSOLECONFIG_FRAMEBUFFER_CONSOLECONFIG_FRAMEBUFFER_CONSOLECONFIG_LOGOCONFIG_LOGOCONFIG_LOGOCONFIG_LOGO第一个编译选项表示内核支持帧缓冲区控制台,它对应的配置菜单项为::DeviceDeviceDeviceDeviceDriversDriversDriversDrivers ---- GraphicsGraphicsGraphicsGraphics supportsupportsupportsupport ---- ConsoleConsoleConsoleConsole displaydisplaydisplaydisplay driverdriverdriverdriver supportsupportsupportsupport ---- FramebufferFramebufferFramebufferFramebufferConsoleConsoleConsoleConsole supportsupportsupportsupport。

      第二个编译选项表示内核在启动的过程中,需要显示 LOGO,它对应的配置菜单项为: DeviceDeviceDeviceDevice DriversDriversDriversDrivers ---- GraphicsGraphicsGraphicsGraphics supportsupportsupportsupport ---- BootupBootupBootupBootuplogologologologo 配置 Android内核编译选项可以参考在 Ubuntu 上下载、编译和安装 Android 最新内核源代码(LinuxKernel)一文帧缓冲区硬件设备在内核中有一个对应的驱动程序模块 fbmem,它实现在文件kernel/goldfish/drivers/video/fbmem.c 中,它的初始化函数如下所示:1/**2*fbmem_init - init frame buffer subsystem3*4*Initialize the frame buffer subsystem.5*6*NOTE: This function is _only_ to be called by drivers/char/mem.c.7*8*/910staticstaticstaticstatic intintintint __init11fbmem_init(voidvoidvoidvoid)12{13proc_create(“fb“, 0, NULL, 1415ifififif (register_chrdev(FB_MAJOR,“fb“,1718fb_class = class_create(THIS_MODULE, “graphics“);19ifififif (IS_ERR(fb_class)) {20printk(KERN_WARNING “Unable to create fb class; errno = %ld\n“,PTR_ERR(fb_class));21fb_class = NULL;22}23returnreturnreturnreturn 0;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 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*/3536intintintint37register_framebuffer(structstructstructstruct fb_info *fb_info)38{39intintintint i;40structstructstructstruct fb_event event;41......4243ifififif (num_registered_fb == FB_MAX)44returnreturnreturnreturn -ENXIO;4546......4748num_registered_fb++;49forforforfor (i = 0 ; i node = i;53mutex_init(54fb_info->dev = device_create(fb_class, fb_info->device,55MKDEV(FB_MAJOR, i), NULL, “fb%d“, i);56ifififif (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} elseelseelseelse61fb_init_device(fb_info);6263......6465registered_fb[i] = fb_info;6667event.info = fb_info;68fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, 69returnreturnreturnreturn 0;70}由于系统中可能会存在多个帧缓冲区硬件设备,因此,fbmem 模块使用一个数组registered_fb 保存所有已经注册了的帧缓冲区硬件设备,其中,每一个帧缓冲区硬件都是使用一个结构体 fb_info 来描述的。

      我们知道,在 Linux 内核中,每一个硬件设备都有一个主设备号和一个从设备号,它们用来唯一地标识一个硬件设备对于帧缓冲区硬件设备来说,它们的主设备号定义为FB_MAJOR(29) ,而从设备号则与注册的顺序有关,它们的值依次等于0,1,2等每一个被注册的帧缓冲区硬件设备在/dev目录和/sys/class/graphics目录下都有一个对应的设备文件 fb,其中,表示一个从设备号例如,第一个被注册的帧缓冲区硬件设备在/dev 目录和/sys/class/graphics 目录下都有一个对应的设备文件 fb0用户空间的应用程序通过这个设备文件就可以操作帧缓冲区硬件设备了, 即将要显示的画面渲染到帧缓冲区硬件设备上去这个函数最后会通过调用函数 fb_notifier_call_chain 来通知帧缓冲区控制台, 有一个新的帧缓冲区设备被注册到内核中来了帧缓冲区控制台在内核中对应的驱动程序模块为 fbcon,它实现在文件kernel/goldfish/drivers/video/console/fbconn.c 中,它的初始化函数如下所示:71staticstaticstaticstatic structstructstructstruct notifier_block fbcon_event_notifier = {72.notifier_call= fbcon_event_notify,73};7475......7677staticstaticstaticstatic intintintint __init fb_console_init(voidvoidvoidvoid)78{79intintintint i;8081acquire_console_sem();82fb_register_client(83fbcon_device = device_create(fb_class, NULL, MKDEV(0, 0), NULL,84“fbcon“);8586ifififif (IS_ERR(fbcon_device)) {87printk(KERN_WARNING “Unable to create device “88“for fbcon; errno = %ld\n“,89PTR_ERR(fbcon_device));90fbcon_device = NULL;91} elseelseelseelse92fbcon_init_device();9394forforforfor (i = 0; i info;106......107intintintint ret = 0;108109......110111switchswitchswitchswitch(action) {112......113casecasecasecase FB_EVENT_FB_REGISTERED:114ret = fbcon_fb_registered(info);115breakbreakbreakbreak;116......117118}119120 done:121returnreturnreturnreturn ret;122 }帧缓冲区硬件设备的注册事件最终是由函数 fbcon_fb_registered 来处理的,它的实现如下所示:123 staticstaticstaticstatic intintintint fbcon_fb_registered(structstructstructstruct fb_info *info)124 {125intintintint ret = 0, i, idx = info->node;126127fbcon_select_primary(info);128129ifififif (info_idx == -1) {1。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.