2023年6月21日发(作者:)

Android开机logo修改⽅法【转】⼀体机平台开机logo修改⽅法

1:修改Kernel中的Logo: 若是要替换Kernel中的开机Logo,只需要把内核⽬录drivers/video/logo下的logo_android_1024_⽂件替换掉即可(注意要保持名字⼀样,在IMT的SDK⾥没有这个ppm,默认选择了Standard 224-color logo)。然后从新编译核⼼,把得到的zImage烧写到NandFlash就可以了。其中制作logo_android_1024_的⽅法如下: 1>、找⼀张分别率为1024x600、后缀为png的图⽚。然后放到系统下。 2>、制作ppm⽂件,使⽤命令:这⾥制作的是名字为的png图⽚。 # pngtopnm > # pnmquant 224 > # pnmtoplainpnm > 制作完成之后,把的名字修改为logo_android_1024_,然后替换核⼼中相应的⽂件。 如果没有安装png图⽚制作库的话,在制作ppm⽂件之前需要安装如下库⽂件。 netpbm libnetpbm10 libnetpbm10-dev 加载⽅法: $sudo apt-get install netpbm libnetpbm10 libnetpbm10-dev 加载完成之后就可以制作了。核⼼Logo在内核配置中的位置如下:Device Drivers ---> Graphics support ---> [*] Bootup logo --->

其中[*] Standard 224-color logo(1024X600)为我们制作的开机Logo,[ ] Standard 224-color Linux logo是Linux⾃带的开机Logo⼩企鹅。

2:修改系统的开机LogoAndroid系统的开机Logo是播放⼀个名字为的压缩⽂件,在系统中的位置为data/local/。可以在Android系统中直接替换。⼀般是在Android系统运⾏之后替换掉data/local/下的⽂件⽐较⽅便。

⽂件是zip压缩⽂件,压缩⽅式要求是存储压缩,包含⼀个⽂件和两个⽬录: 1.动画属性描述⽂件: 2.第⼀阶段动画图⽚⽬录:part0 3.第⼆阶段动画图⽚⽬录:part1

⽂件内容: 1024 600 30 p 1 0 part0 p 0 10 part1

⽂件分析: 1024 600 30 宽 ⾼ 帧数 p 1 0 part0 标志符 循环次数 阶段切换间隔时间 对应⽬录名 p 0 10 part1 标志符 循环次数 阶段切换间隔时间 对应⽬录名

================== 标志符: 必须是: p

循环次数: 0 : 表⽰本阶段⽆限循环

阶段切换间隔时间: 单位是⼀个帧的持续时间,⽐如帧数是30,那么帧的持续时间就是1秒/30 = 33.3毫秒。 阶段切换间隔时间期间开机动画进程进⼊休眠,把CPU时间让给初始化系统使⽤。 也就是间隔长启动会快,但会影响动画效果。

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

⽂件的制作⽅法如下: 1)、先制作、part0和part1三个⽂件,如下:

2)、把、part0和part1三个⽂件制作为⾃拍格式的压缩⽂件,如下:

其中图⽰标出的1、2和3和地⽅必须如图所⽰。在点击确定之后就会⽣成⼀个⽂件,即时Android系统播放的logo⽂件。直接替换掉系统data/local/下的即可。

针对⼀体机平台,最简单的修改⽅法是把part2下的bootloop_frame_⽂件替换掉即可。

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.h2、开机⽂字("A N D R I O D")Android 系统启动后,init.c中main()调⽤load_565rle_image()函数读取/(⼀张565 rle压缩的位图),如果读取成功,则在/dev/graphics/fb0显⽰Logo图⽚;如果读取失败,则将/dev/tty0设为TEXT模式,并打开/dev/tty0,输出⽂本“A N D R I O D”字样。定义加载图⽚⽂件名称#define INIT_IMAGE_FILE "/"

int load_565rle_image( char *file_name );

#endifinit.c中main()加载/⽂件。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 = "n" "n" "n" "n" "n" "n" "n" // console is 40 cols x 30 lines "n" "n" "n" "n" "n" "n" "n" //" 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//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 < > )。说明:在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解析(其中定义服务:“service bootanim /system/bin/bootanimation”),bootanim服务由oRun()(property_set("", "bootanim");)执⾏开机动画、bootFinished()(property_set("", "bootanim");)执⾏停⽌开机动画。BootAnimation.h和⽂件放到了/frameworks/base/cmds/bootanimation⽬录下了,增加了⼀个⼊⼝⽂件bootanimation_。⽂件中可以看到,将开机动画从原来的SurfaceFlinger⾥提取出来了(,⽣成可执⾏⽂件:bootanimation。代码如下: //===================================

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)

LOCAL_SRC_FILES:= bootanimation_

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 bootanim”执⾏开机动画;命令“getprop bootanim”停⽌开机动画。这两句命令分别对应的两句语句:property_set("", "bootanim");和property_set("", "bootanim");相关⽂件:

/frameworks/base/cmds/bootanimation/BootAnimation.h

/frameworks/base/cmds/bootanimation/

/frameworks/base/cmds/bootanimation/bootanimation_

/system/core/init/init.c

/system/core/rootdir/init.r说明:android开机动画的源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/或/system/media/⾥⾯的png或者jpg图⽚以动画的形式播放出来。⾸先,我们先来分析⼀下源码:frameworks/base/cmds/bootanimation/⾸先看⼀下定义的常量:#define USER_BOOTANIMATION_FILE "/data/local/"

#define SYSTEM_BOOTANIMATION_FILE "/system/media/"#define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/"BootAnimation::readyToRun()进⼊⼀个if判断语句if((encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) ==0) && ((SYSTEM_ENCRYPTED_BOOTANIMATION_FILE) ==NO_ERROR)) ||

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

((access(SYSTEM_BOOTANIMATION_FILE, R_OK) ==0) && ((SYSTEM_BOOTANIMATION_FILE) ==NO_ERROR))) { mAndroidAnimation =false; }BootAnimation::threadLoop()if(mAndroidAnimation) { r =Android(); //执⾏android字体闪动的图⽚ } else{ r =movie(); //执⾏中提供的动画图⽚ }==> BootAnimation::Android()会加载"images/"和"images/"==> BootAnimation::movie()会加载中的内容RK提供的源码⾥默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画⾯所以如果要⽤.zip的动画那么只要把做好的动画拷贝到编译好对应的⽬录下即可,如果想修改android闪动的那两张图⽚的话,最简单的⽅法是直接替换图⽚,那两张图⽚在./frameworks/base/core/res/assets/images ⽬录下,⼀张镂空的android图,⼀张发光效果,动画效果就是下⾯那张发光的效果图不断左右移动。

/frameworks/base/core/res/assets/images/roid默认的前景图⽚,⽂字部分镂空,⼤⼩256×64/frameworks/base/core/res/assets/images/roid默认的背景图⽚,有动感效果,⼤⼩512×64

2023年6月21日发(作者:)

Android开机logo修改⽅法【转】⼀体机平台开机logo修改⽅法

1:修改Kernel中的Logo: 若是要替换Kernel中的开机Logo,只需要把内核⽬录drivers/video/logo下的logo_android_1024_⽂件替换掉即可(注意要保持名字⼀样,在IMT的SDK⾥没有这个ppm,默认选择了Standard 224-color logo)。然后从新编译核⼼,把得到的zImage烧写到NandFlash就可以了。其中制作logo_android_1024_的⽅法如下: 1>、找⼀张分别率为1024x600、后缀为png的图⽚。然后放到系统下。 2>、制作ppm⽂件,使⽤命令:这⾥制作的是名字为的png图⽚。 # pngtopnm > # pnmquant 224 > # pnmtoplainpnm > 制作完成之后,把的名字修改为logo_android_1024_,然后替换核⼼中相应的⽂件。 如果没有安装png图⽚制作库的话,在制作ppm⽂件之前需要安装如下库⽂件。 netpbm libnetpbm10 libnetpbm10-dev 加载⽅法: $sudo apt-get install netpbm libnetpbm10 libnetpbm10-dev 加载完成之后就可以制作了。核⼼Logo在内核配置中的位置如下:Device Drivers ---> Graphics support ---> [*] Bootup logo --->

其中[*] Standard 224-color logo(1024X600)为我们制作的开机Logo,[ ] Standard 224-color Linux logo是Linux⾃带的开机Logo⼩企鹅。

2:修改系统的开机LogoAndroid系统的开机Logo是播放⼀个名字为的压缩⽂件,在系统中的位置为data/local/。可以在Android系统中直接替换。⼀般是在Android系统运⾏之后替换掉data/local/下的⽂件⽐较⽅便。

⽂件是zip压缩⽂件,压缩⽅式要求是存储压缩,包含⼀个⽂件和两个⽬录: 1.动画属性描述⽂件: 2.第⼀阶段动画图⽚⽬录:part0 3.第⼆阶段动画图⽚⽬录:part1

⽂件内容: 1024 600 30 p 1 0 part0 p 0 10 part1

⽂件分析: 1024 600 30 宽 ⾼ 帧数 p 1 0 part0 标志符 循环次数 阶段切换间隔时间 对应⽬录名 p 0 10 part1 标志符 循环次数 阶段切换间隔时间 对应⽬录名

================== 标志符: 必须是: p

循环次数: 0 : 表⽰本阶段⽆限循环

阶段切换间隔时间: 单位是⼀个帧的持续时间,⽐如帧数是30,那么帧的持续时间就是1秒/30 = 33.3毫秒。 阶段切换间隔时间期间开机动画进程进⼊休眠,把CPU时间让给初始化系统使⽤。 也就是间隔长启动会快,但会影响动画效果。

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

⽂件的制作⽅法如下: 1)、先制作、part0和part1三个⽂件,如下:

2)、把、part0和part1三个⽂件制作为⾃拍格式的压缩⽂件,如下:

其中图⽰标出的1、2和3和地⽅必须如图所⽰。在点击确定之后就会⽣成⼀个⽂件,即时Android系统播放的logo⽂件。直接替换掉系统data/local/下的即可。

针对⼀体机平台,最简单的修改⽅法是把part2下的bootloop_frame_⽂件替换掉即可。

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.h2、开机⽂字("A N D R I O D")Android 系统启动后,init.c中main()调⽤load_565rle_image()函数读取/(⼀张565 rle压缩的位图),如果读取成功,则在/dev/graphics/fb0显⽰Logo图⽚;如果读取失败,则将/dev/tty0设为TEXT模式,并打开/dev/tty0,输出⽂本“A N D R I O D”字样。定义加载图⽚⽂件名称#define INIT_IMAGE_FILE "/"

int load_565rle_image( char *file_name );

#endifinit.c中main()加载/⽂件。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 = "n" "n" "n" "n" "n" "n" "n" // console is 40 cols x 30 lines "n" "n" "n" "n" "n" "n" "n" //" 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//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 < > )。说明:在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解析(其中定义服务:“service bootanim /system/bin/bootanimation”),bootanim服务由oRun()(property_set("", "bootanim");)执⾏开机动画、bootFinished()(property_set("", "bootanim");)执⾏停⽌开机动画。BootAnimation.h和⽂件放到了/frameworks/base/cmds/bootanimation⽬录下了,增加了⼀个⼊⼝⽂件bootanimation_。⽂件中可以看到,将开机动画从原来的SurfaceFlinger⾥提取出来了(,⽣成可执⾏⽂件:bootanimation。代码如下: //===================================

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)

LOCAL_SRC_FILES:= bootanimation_

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 bootanim”执⾏开机动画;命令“getprop bootanim”停⽌开机动画。这两句命令分别对应的两句语句:property_set("", "bootanim");和property_set("", "bootanim");相关⽂件:

/frameworks/base/cmds/bootanimation/BootAnimation.h

/frameworks/base/cmds/bootanimation/

/frameworks/base/cmds/bootanimation/bootanimation_

/system/core/init/init.c

/system/core/rootdir/init.r说明:android开机动画的源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/或/system/media/⾥⾯的png或者jpg图⽚以动画的形式播放出来。⾸先,我们先来分析⼀下源码:frameworks/base/cmds/bootanimation/⾸先看⼀下定义的常量:#define USER_BOOTANIMATION_FILE "/data/local/"

#define SYSTEM_BOOTANIMATION_FILE "/system/media/"#define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/"BootAnimation::readyToRun()进⼊⼀个if判断语句if((encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) ==0) && ((SYSTEM_ENCRYPTED_BOOTANIMATION_FILE) ==NO_ERROR)) ||

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

((access(SYSTEM_BOOTANIMATION_FILE, R_OK) ==0) && ((SYSTEM_BOOTANIMATION_FILE) ==NO_ERROR))) { mAndroidAnimation =false; }BootAnimation::threadLoop()if(mAndroidAnimation) { r =Android(); //执⾏android字体闪动的图⽚ } else{ r =movie(); //执⾏中提供的动画图⽚ }==> BootAnimation::Android()会加载"images/"和"images/"==> BootAnimation::movie()会加载中的内容RK提供的源码⾥默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画⾯所以如果要⽤.zip的动画那么只要把做好的动画拷贝到编译好对应的⽬录下即可,如果想修改android闪动的那两张图⽚的话,最简单的⽅法是直接替换图⽚,那两张图⽚在./frameworks/base/core/res/assets/images ⽬录下,⼀张镂空的android图,⼀张发光效果,动画效果就是下⾯那张发光的效果图不断左右移动。

/frameworks/base/core/res/assets/images/roid默认的前景图⽚,⽂字部分镂空,⼤⼩256×64/frameworks/base/core/res/assets/images/roid默认的背景图⽚,有动感效果,⼤⼩512×64