zoukankan      html  css  js  c++  java
  • Android开机logo修改方法 【转】

    本文转载自:http://blog.csdn.net/qq258711519/article/details/7766303

    一体机平台开机logo修改方法

    1:修改Kernel中的Logo:

           若是要替换Kernel中的开机Logo,只需要把内核目录drivers/video/logo下的logo_android_1024_clut224.ppm文件替换掉即可(注意要保持名字一样,在IMT的SDK里没有这个ppm,默认选择了Standard 224-color Linux logo)。然后从新编译核心,把得到的zImage烧写到Nand Flash就可以了。其中制作logo_android_1024_clut224.ppm的方法如下:

          1>、找一张分别率为1024x600、后缀为png的图片。然后放到linux系统下。

           2>、制作ppm文件,使用命令:这里制作的是名字为linuxlogo.png的png图片。

                  # pngtopnm linuxlogo.png > linuxlogo.pnm

    # pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm

    # pnmtoplainpnm linuxlogo224.pnm > linuxlogo224.ppm

           制作完成之后,把linuxlogo224.ppm的名字修改为logo_android_1024_clut224.ppm,然后替换核心中相应的文件。

           如果没有安装png图片制作库的话,在制作ppm文件之前需要安装如下库文件。

           netpbm libnetpbm10 libnetpbm10-dev

           加载方法:

       $sudo apt-get install netpbm libnetpbm10 libnetpbm10-dev

           加载完成之后就可以制作了。

    核心Logo在内核配置中的位置如下:

    Device Drivers  --->

           Graphics support  --->

                  [*] Bootup logo  --->

     

           其中[*]   Standard 224-color Android logo(1024X600)为我们制作的开机Logo,

    [ ]   Standard 224-color Linux logo是Linux自带的开机Logo小企鹅。

    2:修改android系统的开机Logo

    Android系统的开机Logo是播放一个名字为bootanimation.zip的压缩文件,在系统中的位置为data/local/bootanimation.zip。可以在Android系统中直接替换。一般是在Android系统运行之后替换掉data/local/下的bootanimation.zip文件比较方便。

          

           bootanimation.zip文件是zip压缩文件,压缩方式要求是存储压缩,包含一个文件和两个目录:

           1.动画属性描述文件:desc.txt

        2.第一阶段动画图片目录:part0

        3.第二阶段动画图片目录:part1

     

    desc.txt文件内容:

            1024 600 30

           p 1 0 part0

            p 0 10 part1

       

    desc.txt文件分析:

            1024  600   30

            宽    高    帧数

            p         1              0         part0

            标志符 循环次数 阶段切换间隔时间  对应目录名

            p         0             10         part1

            标志符 循环次数 阶段切换间隔时间  对应目录名

     

        ==================

        标志符:

            必须是: p

     

        循环次数:

            0 : 表示本阶段无限循环

     

        阶段切换间隔时间:

            单位是一个帧的持续时间,比如帧数是30,那么帧的持续时间就是1秒/30 = 33.3毫秒。

            阶段切换间隔时间期间开机动画进程进入休眠,把CPU时间让给初始化系统使用。

            也就是间隔长启动会快,但会影响动画效果。

     

    part0和part1目录内包含的是两个动画的系列图片,图片为PNG格式。系列图片文件的加载刷新按文件名的名称排序。

     

         bootanimation.zip文件的制作方法如下:

           1)、先制作desc.txt、part0和part1三个文件,如下:

     

        2)、把desc.txt、part0和part1三个文件制作为自拍格式的压缩文件,如下:

     

        其中图示标出的1、2和3和地方必须如图所示。在点击确定之后就会生成一个bootanimation.zip文件,即时Android系统播放的logo文件。直接替换掉系统data/local/下的bootanimation.zip即可。

    针对一体机平台,最简单的修改方法是把part2下的bootloop_frame_0001.png文件替换掉即可。

     

    Android开机画面原理

    Android系统开机画面分为下面三个阶段: 
    1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片); 
    2. Android平台启动初始化,出现"A N D R I O D"文字字样画面; 
    3. Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。

    1、开机图片(Linux小企鹅) (Android 1.5及以上版本已经取消加载图片); 
    Linux Kernel引导启动后,加载该图片。 
    logo.c中定义nologo,在fb_find_logo(int depth)函数中根据nologo的值判断是否需要加载相应图片。(源码:kerneldriversvideologo)
    代码如下: 
    static int nologo; 
    module_param(nologo, bool, 0); 
    MODULE_PARM_DESC(nologo, "Disables startup logo");
    /* logo's are marked __initdata. Use __init_refok to tell 
    * modpost that it is intended that this function uses data 
    * marked __initdata. 
    */ 
    const struct linux_logo * __init_refok fb_find_logo(int depth) 

    const struct linux_logo *logo = NULL;
    if (nologo) 
    return NULL; 
            ...... 

    相关代码: 
    /kernel/drivers/video/fbmem.c 
    /kernel/drivers/video/logo/logo.c 
    /kernel/drivers/video/logo/Kconfig 
    /kernel/include/linux/linux_logo.h
    2、开机文字("A N D R I O D")

    Android 系统启动后,init.c中main()调用load_565rle_image()函数读取/initlogo.rle(一张565 rle压缩的位图),如果读取成功,则在/dev/graphics/fb0显示Logo图片;如果读取失败,则将/dev/tty0设为TEXT模式,并打开/dev/tty0,输出文本“A N D R I O D”字样。

    定义加载图片文件名称

    #define INIT_IMAGE_FILE "/initlogo.rle" 
    int load_565rle_image( char *file_name ); 
    #endif
    init.c中main()加载/initlogo.rle文件。

    static int console_init_action(int nargs, char **args)

    {

        int fd;

        char tmp[PROP_VALUE_MAX];

        if (console[0]) {

            snprintf(tmp, sizeof(tmp), "/dev/%s", console);

            console_name = strdup(tmp);

        }

        fd = open(console_name, O_RDWR);

        if (fd >= 0)

            have_console = 1;

        close(fd);

        if( load_565rle_image(INIT_IMAGE_FILE) ) {

            fd = open("/dev/tty0", O_WRONLY);

            if (fd >= 0) {

                const char *msg;

                    msg = " "

                " "

                " "

                " "

                " "

                " "

                " "  // console is 40 cols x 30 lines

                " "

                " "

                " "

                " "

                " "

                " "

                " "

                //"             A N D R O I D ";

                "             R o c k c h i p   R - B O X";

                write(fd, msg, strlen(msg));

                close(fd);

            }

        }

        return 0;

    }

    相关代码:

    /system/core/init/init.c
    /system/core/init/init.h
    /system/core/init/init.rc
    /system/core/init/logo.c

    /kernel/drivers/staging/msm/Logo.c

    *.rle文件的制作步骤:
    a. 使用GIMP或者Advanced Batch Converter软件,将图象转换为RAW格式;
    b. 使用android自带的rgb2565工具,将RAW格式文件转换为RLE格式(如:rgb2565 -rle < initlogo.raw > initlogo.rle)。

    说明:

    在RK盒子上没有显示出R o c k c h i p   R - B O X字样是因为linux内核配置的问题。
    打开内核framebuffer控制台即可。
    (1)make menuconifg后选择Device Drivers->Graphics support->Console display driver support->Framebuffer Console support
    然后打开相关的几个配置选项即可。
    3、开机动画(闪动的ANDROID字样的动画图片)

    Android 1.6及以上版本: 
    init.c解析init.rc(其中定义服务:“service bootanim /system/bin/bootanimation”),bootanim服务由SurfaceFlinger.readyToRun()(property_set("ctl.start", "bootanim");)执行开机动画、bootFinished()(property_set("ctl.stop", "bootanim");)执行停止开机动画。
    BootAnimation.h和BootAnimation.cpp文件放到了/frameworks/base/cmds/bootanimation目录下了,增加了一个入口文件bootanimation_main.cpp。Android.mk文件中可以看到,将开机动画从原来的SurfaceFlinger里提取出来了(,生成可执行文件:bootanimation。Android.mk代码如下: 
    //=============Android.mk====================== 
    LOCAL_PATH:= $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_SRC_FILES:=

           bootanimation_main.cpp

           BootAnimation.cpp

    LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES

    LOCAL_SHARED_LIBRARIES :=

           libcutils

           libutils

           libbinder

        libui

           libskia

        libEGL

        libGLESv1_CM

        libgui

    LOCAL_C_INCLUDES :=

           $(call include-path-for, corecg graphics)

    LOCAL_MODULE:= bootanimation

    include $(BUILD_EXECUTABLE) 
    //========================================== 
    (1)adb shell后,可以直接运行“bootanimation”来重新看开机动画,它会一直处于动画状态,而不会停止。 
    (2)adb shell后,命令“setprop ctl.start bootanim”执行开机动画;命令“getprop ctl.start bootanim”停止开机动画。这两句命令分别对应SurfaceFlinger.cpp的两句语句:property_set("ctl.start", "bootanim");和property_set("ctl.stop", "bootanim");

    相关文件: 
    /frameworks/base/cmds/bootanimation/BootAnimation.h 
    /frameworks/base/cmds/bootanimation/BootAnimation.cpp 
    /frameworks/base/cmds/bootanimation/bootanimation_main.cpp 
    /system/core/init/init.c 
    /system/core/rootdir/init.r

    说明:

    android开机动画的源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/bootanimation.zip或/system/media/bootanimation.zip里面的png或者jpg图片以动画的形式播放出来。

    首先,我们先来分析一下源码:

    frameworks/base/cmds/bootanimation/BootAnimation.cpp

    首先看一下定义的常量:

    #define USER_BOOTANIMATION_FILE "/data/local/bootanimation.zip"

      

    #define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip"

    #define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/bootanimation-encrypted.zip"

    BootAnimation::readyToRun()

    进入一个if判断语句

    if((encryptedAnimation &&

                (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) ==0) &&

                (mZip.open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE) ==NO_ERROR)) ||

      

                ((access(USER_BOOTANIMATION_FILE, R_OK) ==0) &&

                (mZip.open(USER_BOOTANIMATION_FILE) ==NO_ERROR)) ||

      

                ((access(SYSTEM_BOOTANIMATION_FILE, R_OK) ==0) &&

                (mZip.open(SYSTEM_BOOTANIMATION_FILE) ==NO_ERROR))) {

            mAndroidAnimation =false;

        }

    BootAnimation::threadLoop()

    if(mAndroidAnimation) {

     r =Android(); //执行android字体闪动的图片

     } else{

     r =movie(); //执行bootanimation.zip中提供的动画图片

     }

    ==> BootAnimation::Android()会加载"images/android-logo-mask.png"和"images/android-logo-shine.png"
    ==> BootAnimation::movie()会加载bootanimation.zip中的内容

    RK提供的源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面

    所以如果要用.zip的动画那么只要把做好的动画拷贝到编译好对应的目录下即可,如果想修改android闪动的那两张图片的话,最简单的方法是直接替换图片,那两张图片在./frameworks/base/core/res/assets/images  目录下,一张镂空的android图,一张发光效果,动画效果就是下面那张发光的效果图不断左右移动。

    /frameworks/base/core/res/assets/images/android-logo-mask.png
    Android默认的前景图片,文字部分镂空,大小256×64
    /frameworks/base/core/res/assets/images/android-logo-shine.png
    Android默认的背景图片,有动感效果,大小512×64

  • 相关阅读:
    使用git svn工具进行svn 到git仓库的同步[持续更新]
    解决Linux无法存储svn密码
    spring boot @ResponseBody 注解情况下返回自定义类报错406
    解决mysql密码正确的情况下而无法连接的问题
    react项目实现国际化i18n
    github clone加速
    Centos模板机配置
    Xshell终端连接服务器慢,问题解决方法
    佛祖保佑永无 BUG 代码注释
    本地代理web端口
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7412513.html
Copyright © 2011-2022 走看看