zoukankan      html  css  js  c++  java
  • Android系统开机启动画面显示过程简要说明

    开机启动会显示三个画面:

    1. Linux内核的启动画面,静态画面
    2. Init进程启动过程中出现的静态画面
    3. 系统服务启动过程中出现的动态画面

    这些画面的显示的过程不同,但最终是通过framebuffer显示的,每层对它显示的过程进行了封装。即无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的。

    Framebuffer是对硬件显示设备的抽象,屏蔽底层不同的显示设备。对framebuffer上进行写操作即可得到对应的画面。

    第一个启动画面:显示一只企鹅

    比较直接的使用framebuffer,通过最终的info->fbops->fb_imageblit(info, image);  调用实现画面的显示,回调函数fb_imageblit就是用来在指定的帧缓冲区硬件设备渲染指定的图像的。

    第二个启动画面

    也相对比较简单,调用load_565rle_image(INIT_IMAGE_FILE)来显示画面,最终调用framebuffer中的接口fb_open来打开设备文件/dev/graphics/fb0,打开了设备文件/dev/graphics/fb0之后,我们就可以将文件/initlogo.rle的内容输出到帧缓冲区硬件设备中去了。

    第三个启动画面

    比较复杂,涉及到系统服务SurfaceFlinger。 

    由应用程序bootanimation来负责显示的。应用程序bootanimation在启动脚本init.rc中被配置成了一个服务。

    当SurfaceFlinger服务启动的时候,它会通过修改系统属性ctl.start的值来通知init进程启动应用程序bootanimation,以便可以显示第三个开机画面,而当System进程将系统中的关键服务都启动起来之后,ActivityManagerService服务就会通知SurfaceFlinger服务来修改系统属性ctl.stop的值,以便可以通知init进程停止执行应用程序bootanimation,即停止显示第三个开机画面。

    SurfaceFlinger::init() –> startBootAnim()->property_set("ctl.start", "bootanim");

    SurfaceFlinger::init()中首先对设备主屏幕以及OpenGL库进行初始化,初始化完成后调用startBootAnim(),startBootAnim()中调用property_set("ctl.start", "bootanim");,属性改变,init进程就会接收到一个系统属性变化通知,这个通知最终是由在init进程中的函数handle_property_set_fd来处理的。

    最终会调用bootanimation服务,此服务中通过EGL来初始化OpenGL,为OpenGL显示画面做准备。最后利用openGL接口进行画面的渲染,通过glSwapBuffers(mDisplay, mSurface)显示画面。

  • 相关阅读:
    算法:POJ1008 Maya Calendar
    给我的十八岁
    算法:POJ1007 DNA sorting
    算法:POJ1006 三重峰值问题
    【树链剖分】洛谷P3384树剖模板
    【树链剖分】洛谷P3379 树链剖分求LCA
    【Tarjan缩点】PO3352 Road Construction
    【Dijkstra堆优化】洛谷P2243电路维修
    【Tarjan缩点】POJ2186 Popular Cows
    【最短路·差分约束】洛谷P1250
  • 原文地址:https://www.cnblogs.com/OUSUO/p/4040417.html
Copyright © 2011-2022 走看看