Android(1.5及以上版本) 开机图片/文字/动画分析[转载、修改部分内容] 收藏
Android 开机会出现3个画面:
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的值判断是否需要加载相应图片。
代码如下:
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文件。
if( load_565rle_image(INIT_IMAGE_FILE) ) {//加载initlogo.rle文件
fd = open("/dev/tty0", O_WRONLY);//将/dev/tty0设为text模式
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 ";
write(fd, msg, strlen(msg));
close(fd);
}
}相关代码: /system/core/init/init.c
/system/core/init/init.h /system/core/init/init.rc /system/core/init/logo.c *.rle文件的制作步骤: a. 使用GIMP或者Advanced Batch Converter软件,将图象转换为RAW格式; b. 使用android自带的rgb2565工具,将RAW格式文件转换为RLE格式(如:rgb2565 -rle < initlogo.raw > initlogo.rle)。3、开机动画(闪动的ANDROID字样的动画图片)
Android 1.5版本:Android的系统登录动画类似于Windows系统的滚动条,是由前景和背景两张PNG图片组成,这两张图片存在于手机或模拟器/system/framework/framework-res.apk文件当中,对应原文件位于/frameworks/base/core/res/assets/images/。前景图片(android-logo-mask.png)上的Android文字部分镂空,背景图片(android-logo-shine.png)则是简单的纹理。系统登录时,前景图片在最上层显示,程序代码(BootAnimation.android())控制背景图片连续滚动,透过前景图片文字镂空部分滚动显示背景纹理,从而实现动画效果。
相关代码:
/frameworks/base/libs/surfaceflinger/BootAnimation.h
/frameworks/base/libs/surfaceflinger/BootAnimation.cpp
/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
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
# need "-lrt" on Linux simulator to pick up clock_gettime
ifeq ($(TARGET_SIMULATOR),true)
ifeq ($(HOST_OS),linux)
LOCAL_LDLIBS += -lrt
endif
endif
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libui \
libcorecg \
libsgl \
libEGL \
libGLESv1_CM \
libmedia
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.rc
/////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
刷第一个开机画面软件使用教程:
先打开机子的fastboot模式
1:先找好图片(适合自己分辨率的图片)放在工具里(最好是PNG格式,其他格式容易失真)
2:点开 G2开机画面制作工具
3:点OPEN打开图片
4:点convert生成第一个开机画面文件
5:刷开机画面(系统C:\WINDOWS\system32里面必须有Adb那2个文件)
刷第二屏开机画面比较麻烦
下面分析一下2.0、2.1系统开机画面的构成
文件名为bootanimation.zip 一定是这个不能修改
里面包含part1 part2文件夹 和desc.txt(另一种就是android文件夹+desc.txt,这样设置就可以改系统开机几秒的音乐了)
part 文件夹里面放的是动画拆分的图片 格式为png 大家可以自己制作
desc.txt里面是播放的设置
格式是这样的
480 800 15
p 1 0 part1
p 0 0 part2
480 800是指显示的分辨率 宽 高
15是一秒的帧数
p后面的数字是指播放次数 0为循环
后面那位数字 一般为0 pause If pause = 10, it will show the last frame and then sleep 10/fps seconds before continuing with the animation.这是外国人写的 没有很大影响
part0 为文件夹名
为什么要用两个文件夹呢 其实一个也可以的
按照我的设置
part1是播放一遍的
part2是循环播放直到开机
这里看懂了 就可以开始制作了 按照上面的格式搞好之后用 zip软件打包(最好把原来的bootanimation.zip备份一份)
注意文件名不能错一定为bootanimation.zip
制作bootanimation.zip
首先从里面的图片说起 图片一定要转换成PNG格式,建议找到的图片要和自己机子的分辨率一样,如果不是也可以的 有可能变形 注意图片的大小要统一(如果不会做连接的图片组 直接找个适合自己分辨率的动态图片分解出PNG格式的静态图片,用ImageReady可以批量导出)
建立part1 part2或android文件夹 放进一组连接的图片组
开始压缩成ZIP格式 名字一定要bootanimation.zip 压缩方式一定是存储 压缩完了看下大小一般最大的2MB左右 太大了用JPEG Imager压缩下 压缩图片很好的
开始写desc.txt (文件每节后面有个黑色符号不知道是什么 最好写的时候看下我传的样本)
desc.txt 格式(解释看上面)
有2个文件夹 part1、part2 (此种没开机声音)
代码:
320 480 15
p 1 1 part1
p 0 0 part2
有1个文件夹 android (有声音 声音文件下面讲解)
320 480 15
p 1 1 android
保存后拖入bootanimation.zip 里面OK
android文件夹的声音文件制作
把一个体积很小的MP3文件改成android_audio.mp3 放到system/media/ 和system/customize/resource/
刷的时候直接用ES或Root explorer打开system读写权限R/O 直接用ES、Root explorer或91助手(用91的时候也要用ES或Root explorer打开system读写权限R/O)替换system/media/bootanimation.zip 和system/customize/resource/bootanimation.zip 两处的文件 重新启动成功刷完2.0、2.1系统的开机第二画面
/////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
Android 2.0 开机动画文件分析。
开机动画文件:bootanimation.zip
动画是由系列图片连续刷屏实现的。。
bootanimation.zip文件是zip压缩文件,压缩方式要求是存储压缩,包含一个文件和两个目录:
1.动画属性描述文件:desc.txt
2.第一阶段动画图片目录:part0
3.第二阶段动画图片目录:part1
desc.txt文件内容:
480 427 30
p 1 0 part0
p 0 10 part1
desc.txt文件分析:
480 427 30
宽 高 帧数
p 1 0 part0
标志符 循环次数 阶段切换间隔时间 对应目录名
p 0 10 part1
标志符 循环次数 阶段切换间隔时间 对应目录名
==================
标志符:
必须是: p
循环次数:
0 : 表示本阶段无限循环
阶段切换间隔时间:
&nbs
在ubuntu
zip -Z store bootanimation.zip part0/*PNG part1/*PNG desc.txt
OR
zip -0 bootanimation.zip part0/*PNG part1/*PNG desc.txt
adb push bootanimation.zip /system/media/