Android开机动画制作与播放原理简介

源码分析:

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 表示该服务只执行一次;

转载于:https://my.oschina.net/cht2000/blog/910445

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值