源码分析:
1.Linux系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片);
2. Android平台启动初始化,出现"A N D R I O D"文字字样画面;
3.Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。
现在我们说的是第三种方式(基于模拟器):
Android开机动画叫源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/bootanimation.zip或/system/media/bootanimation.zip里面的png图片以动画的形式播放出来。
首先,我们先来分析一下源码:
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; // mAndroidAnimation的初始值为true
}
BootAnimation::threadLoop()函数中有如下语句:
if (mAndroidAnimation) {
r = android();
} else {
r = movie();
}
==> BootAnimation::Android()会加载"images/android-logo-mask.png"和"images/android-logo-shine.png";
==> BootAnimation::movie()会加载bootanimation.zip中的内容;
readyToRun()方法判断/system/media/bootanimation.zip(shutanimaion.zip)是否存在,如果存在,则将mAndroidAnimation设置false,这个变量决定threadLoop中调用android()还是movie()来具体实现动画的播放。如果system/media/bootanimation.zip存在的话,调用movie(),该接口会解析zip文件中的desc.txt文件,根据txt文件中的配置来播放动画。否则就调用android()来播放原生自带的资源。
我们下载的源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面。
所以如果你是要用.zip的动画那么把你做好的动画拷贝到编译好对应的目录下即可,然后执行make snod整合进img包就可以看到效果了。
如果你想修改android闪动的那两张图片的话,最简单的方法是直接替换图片,如果你懂openGL的话也可以自己做酷炫的动画。
那两张图片放在/frameworks/base/core/res/assets/images目录下,一张镂空的android图,一张发光效果,动画效果就是下面那张发光的效果图不断左右移动。
修改完后直接替换,然后再mmm frameworks/base,make snod 即可。
Android开机动画制作与播放原理简介:
1、开机动画的位置:
system/media/bootanimation.zip,要修改开机动画就是修改bootanimation这个压缩文件。如果不存在该压缩包,使用原生自带的资源,其路径在system/framework/framework- res.apk/assets/images(Android-logo-mask.png,android-logo-shine.png),但是比较难看,比较常见的就是“android”字样。所以要定制自己的开关机动画一般都是在system/media/目录下放置bootanimation.zip和shutanimation.zip.这里以开机动画为例,关机动画和开机动画其原理一样。
2、bootanimation.zip文件结构介绍:
bootanimation里面主要包含一个desc.txt以及N个文件夹。而文件夹里面放着的就是开机动画的图片资源。decs.txt的作用就是指导系统如何去执行开机动画。
desc.txt编写规范,例如开机动画需要用到2个文件夹,分别是folder1和folder2,开机的时候,先把folder1里面的图片都播放一遍,然后再循环播放folder2里面的文件,直到进入系统,decs.txt文档的内容如下:
320 480 12
p 1 0 folder1
p 0 0 folder2
320 480是代表屏幕的分辨率,12表示12帧每秒,简单地说12代表一秒钟播放12张图片;
p 1 0 folder1:p就是play。1是播放一次,0是无限次。0代表阶段间隔帧数为0。folder1就是说,这条指令是针对folder1这个文件夹的。
p 0 0 folder2:第一个0这里是代表循环播放,第二个0和上面第二条指令一样。folder2就是第二个文件夹。
总结规则如下:
第一条指令:[屏幕的分辨率] [播放频率]
第二条指令:[p] [播放次数] [间隔帧数] [文件夹]
第N条指令:同上
将图片资源和动画配置文件打包:
把需要用到的folder文件夹跟decs.txt打包成zip格式,必须是zip,不能是rar,且打包的时压缩方式选择“存储”模式。压缩包名称为bootanimation.zip,最后将制作好的zip包push到/system/media目录下。
注意:bootanimation不能太大,一般最好不要超过3M。
查看动画:
在终端中输入命令:
adb shell---> cd /system/bin--->bootanimation 或者bootanimation shut
这样不用重启即可查看定制的动画,方便。
硬性条件:
手机必须有root权限,否则我们制作好的图片资源没办法push到/system/media目录,另外执行bootanimaiton也有可能没有权限,所以这里要定制自己的手机必须有root权限,当然了至于使用什么样的方式大家可以根据自己的爱好,各显神通。
播放原理:
通过上面的准备开机资源已经制作好了,那android是怎么来实现播放的。首先对于开关机动画的播放,android专门使用了一个native service来实现播放(/system/bin/bootanimation),包括开机铃声的实现也是用该service来实现的。
bootanimation的启动:
Android系统在init.rc中定义了很多Service,具体定义格式可以参考《Android Platform Developer’s Guide》中的“Android Init Language”。Init.rc中定义的Service将会被Init进程创建,其中已经定义的服务就包含bootanimation。
每一项服务必须在/init.rc中定义。Android系统启动时,init守护进程将解析init.rc和启动属性服务,属性“ctl.start”和“ctl.stop”是用来启动和停止服务的。一旦收到设置“ctrl.start”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“init.svc.<服务名>“属性中 。
service bootanim /system/bin/bootanimation
user graphics
group graphics system audio qcom_oncrpc
disabled
oneshot
定义了一个bootanim的服务,对应执行/system/bin/bootanimation。
disabled 表示init进程只是创建它,但不立刻执行;
oneshot 表示该服务只执行一次;