以下的分析以4.4 KITKAT为准。

从理论上来说,android 有4个开机启动画面。

第一个应该是U-BOOT的启动画面,有些设备为了满足按动电源即有显示,在UBOOT里加了开机画面,实现的方式当然只能是写物理地址,也因此随厂家不同具体的实现千差万别。加上我们接触的手机平板等设备大多没这个开机画面,所以这里就不赘述了。


第二个启动画面实际是LINUX的启动画面,但这个启动画面在ANDROID里默认是关闭的,需要打开时就打开kernel选项:

CONFIG_FRAMEBUFFER_CONSOLE

CONFIG_LOGO

意即KERNEL支持帧缓冲控制台,并且显示开机LOGO。

最方便的办法当然是make menuconfig。

第一个对应的配置菜单项为:Device Drivers ---> Graphics support ---> Console display driver support ---> Framebuffer Console support

第二个对应的配置菜单项为:Device Drivers ---> Graphics support ---> Bootup logo

具体执行第一个动画的文件在 kernel/drivers/video/fbmem.c

里面有fb_prepare_logo函数,负责LOAD 开机画面。这个函数会调用kernel/drivers/video/logo/logo.c的fb_find_logo函数来确认最终会用哪张图片。

开机的图片也都在kernel/drivers/video/logo/   目录下,要注意这些图片不是标准的PNG等格式,网上提供了工具来进行转换为所需的PPM格式,这里就不赘述了。


第三个开机画面已经进入了android的范围,是在INIT进程启动的时候加载的。

具体来说,是在system/core/init/init.c 里干的。

queue_builtin_action(console_init_action, "console_init");

console_init_action函数中有一行:

load_565rle_image(INIT_IMAGE_FILE)

这个函数简单说就是显示了一张图,图的路径在INIT_IMAGE_FILE

INIT_IMAGE_FILE的定义是在system/core/init/init.h

#define INIT_IMAGE_FILE "/initlogo.rle"
这个rle文件一般放在device目录下,可以自己用命令搜寻。网上也有工具提供各种图片对这个RLE格式的转换。



第四个开机画面,是我们最常见的安卓手机开机画面。从实现方式来说,其实就是在init.rc里添加了一个bootAnimation的服务,这个服务不是自动运行的,它有一定的运行条件,具体可以参看下它的定义:

service bootanim /system/bin/bootanimation
    class main
    user graphics
    group graphics
    disabled
    oneshot
service shutdownanim /system/bin/bootanimation -shutdown
    class main
    user graphics
    group graphics
    disabled
    oneshot

什么时候它会被执行呢?简单说,就是surfaceFlinger启动的时候,会改变系统变量让它起来,而系统完成启动后(launcher已经起来了),activityManagerService会辗转通知surfaceFlinger,然后又用改变系统属性的办法关闭bootanimation进程。

如上所述,我们就理解了bootanimation是一个循环执行的进程。它的代码在:

frameworks/base/cmds/bootanimation/BootAnimation.cpp

从代码可知这次开机动画有2种模式,一种是使用两张图片利用某种效果来造成动态,另一种则是用一个图包循环显示的方式来形成动态。当然,这时因为mediaplayer已经起来,播放开机动画的时候可以同时播放开机音乐。第一种双图片模式称为android模式,第二种图包模式称为movie模式,他们在循环时通过条件变量来选择其一:

if (mAndroidAnimation) {
        r = android();
    } else {
        r = movie();
    }

这两种模式具体的实现动画的代码比较简单,就不讨论了,只看定义需要的文件之处:

第一种android模式:

 initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png");
    initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png");
这两张图片都在frameworks/base/core/res/assets/images目录下,替换即可。

第二种movie模式:

mZip.open(USER_BOOTANIMATION_FILE) == NO_ERROR)

mZip.open(SYSTEM_BOOTANIMATION_FILE) == NO_ERROR)

#define USER_BOOTANIMATION_FILE "/data/local/bootanimation.zip"
#define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip"
找到并替换bootanimation.zip即可。



以上,就是android开机可以加载的4次开机启动画面。



更多相关文章

  1. android的DeepLink
  2. Android沉浸式状态栏完全解析
  3. android安全问题(四) 抢先开机启动
  4. 《Android开发艺术探索》读书笔记----第二章:Android(安卓)IPC 简
  5. Android(安卓)studio打开机智云APP(自动生成)
  6. java/android 设计模式学习笔记(23)---解释器模式
  7. Android活动一探究竟
  8. Android显式启动与隐式启动Activity
  9. android init进程分析 init脚本解析和处理

随机推荐

  1. Android 光系统
  2. 【转】android APP使用的jar概况
  3. 你知道android的MessageQueue.IdleHandle
  4. com.google.android.providers.GoogleSet
  5. Android学习之RecyclerView
  6. Video的thumbnail抽取算法
  7. Android在一个类中使用Toast,信息显示在另
  8. Android中如何使用列表对话框
  9. Android 开发 TextView中出现参差不齐状
  10. 免费电子书《Android 研发工程师高级进阶