努力学习的蛋蛋

导航

统计

安卓开机logo和开机动画的几种实现方法

安卓4.2可用方法2-4,第一种方法未验证。

从理论上来说,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即可。



posted on 2017-10-31 14:43 努力学习的蛋蛋 阅读(...) 评论(...) 编辑 收藏