两种方式,一种是修改/system/framework/framework-res.apk中资源文件,另一种是自定义bootanimation.zip文件,前提都是手机已经获取root权限。测试时使用的是rk3399 7.1.2的系统,不同版本可能方法会有不同,但原理都一样。
方法一:
此方法的原理是android系统开机启动动画会先读取/system/media/目录下的bootanimation.zip文件,这个文件不存在的话,就会使用system/framework/framework-res.apk中assets目录下的两张图片做动画,/assets/images/android-logo-shine.png和/assets/images/android-logo-mask.png,所以,我们要做的就是替换这两张图片,实现想要的动画效果。这种方式的实现效果很有限,而且比较繁琐,所以还是更多推荐使用方法二。
第一步,下载安装apktool工具包。下面网站给出了详细的步骤Apktool - How to Install,选取自己对应的操作系统下载安装就行。其中chmod +x命令是给文件可执行权限,下面是mac上的命令行使用:
$ chmod +x apktool
执行命令后,apktool文件会显示为可执行文件。命令行中输入apktool 命令验证是否配置成功。
第二步,从手机/system/framework/目录下copy出framework-res.apk文件,需要做好备份,防止因修改错误导致手机系统损坏。
第三步,反编译framework-res.apk,运行下面命令反编译
$ apktool d framework-res.apk
d后面输入的是apk的绝对路径。运行结束后会在当前目录成framework-res.文件夹,结构如下:
然后就可以替换framework-res/assets/images目录下的两张图片了,替换完成后,重新打包apk:
$ apktool b framework-res
b后面参数是framework-res文件夹的绝对路径,运行成功后,会在framework-res/dist目录下生成新的framework-res.apk文件,解压该apk文件,拿到其中resources.arsc文件,和两张替换的动画图片。
第四步,需要下载一个可以查看、编辑压缩包,但不解压的工具。mac版的工具可以用BetterZip,windows版本的可以自行下载合适的工具。用该工具打开从系统中拿出来的framework-res.apk文件,用第三步中拿到的resources.arsc文件和两张图片文件替换framework-res.apk中对应的文件,最后将修改好的framework-res.apk文件放回手机/system/framework/目录下(默认情况下手机/system权限是只读的,需要在手机上安装Root Explorer,将/system目录权限改为可读写),此时重启系统应该就可以看到修改完的开机动画了。
方法二:
前面已经提到,android系统会读取bootanimation.zip来执行开机动画,那么构建bootanimation.zip并替换就可以定制开机动画了。在定制之前需要先知道bootanimation.zip是怎么确定动画的。从/system/media/目录中copy出bootanimation.zip文件(有的系统中没有该文件也没关系,我们定制好直接放到该目录下动画一样会生效),解压后如图:
part0到part3中都是存放的动画帧图片,desc.txt文件则是记录了播放逻辑,如下:
第一行: 920 330 表示图片的分辨率,这个可以根据系统屏幕分辨率和想要的动画效果自己定义,后面 60 表示帧率,即每s播放几帧图片。
第二行: c 为标识符,早期版本值都是p,即part的意思,代表这一行为一个动画片段。现在新增了c 标识符(具体什么版本加入未做深究),表示该动画片段至少会执行一次,意思就是,如果系统发出终止动画指令,p标识的part会立刻停止执行,而c标识的part会继续播放完所有帧后停止,之后的part也是一样,如果标识为p,则不执行,为c,则执行一次,直到所有part都执行完。后面的 1 表示当前part循环次数,如果为0表示无限循环。 再后面的 0 表示延时n帧的时间后播放下一个part,比如当前例子里,帧率是60,那一帧时长为1/60s,所以延时n帧的时间就是n*(1/60)s。后面的 part0 是指图片文件夹的名字。
第三、四、五行同上,每一行均表示一个part。结合上面的例子来说,自上而下,将part分别定义为p1,p2,p3,p4,该动画的执行方式如下:p1执行一次-->p2执行并循环,如果此时收到系统终止动画指令,则p2-->执行完当次-->p3执行一次-->p4执行一次-->完成。
到这里,我们应该可以准备好图片文件和desc.txt文件了,下面要生成bootanimation.zip文件。这里要注意一下,在windows上压缩时需要选择存储模式压缩,在mac下,我没有找到这个选项,所以使用了命令行进行压缩,如下:
$ zip -r -0 bootanimation.zip *
将图片文件和desc.txt文件单独放到同一个文件夹下,在该文件夹下运行上面命令,会在当前文件生成bootanimation.zip文件。替换/system/media/中bootanimation.zip,然后重启就可以看到动画了,也可以通过命令行方式预览动画:
$ adb shell
$ cd /system/bin
$ bootanimation
最后,关于以上的动画执行逻辑,可以参阅源码,下面网址可以在线查阅源码AndroidXRef,主要的执行逻辑在/frameworks/base/cmds/bootanimation/BootAnimation.cpp文件中。