本文将介绍怎样修正Android的开机动画,基于AOSP分支android-14.0.0_r28。
源码剖析
Android制作开机动画相关的代码,首要会集在frameworks/base/cmds/bootanimation/
中,打开咱们能够看到如下的目录结构:
至于开机动画的实践制作,具体在BootAnimation.cpp
中,其它的代码无需关心,要点要看从815行开始的代码:
从这儿咱们能够看到,这儿面做了一个判断,假如没有对应的zip file,那么会履行android()
,假如没有,那么会履行movie()
。
实践上,当咱们查看两个办法的时分能够看到无论咱们运用哪种办法,最后实践上都是运用opengl来制作的,只是movie会读取对应zip文件中的图片来进行制作。
那么这儿咱们能够得出一个结论,咱们有两种办法来修正Android的开机动画,第一种,便是咱们供给给Android所需的zip文件,第二种,便是咱们直接运用opengl来手绘咱们的开机动画。
BootAnimation Zip 文件办法修正开机动画
首要介绍最常用的一种办法,供给开机动画Zip文件。
Where
从上面的源码剖析,咱们现在第一步要做的,便是要找到这个mZipFileName
是怎样赋值的。
实践上Android关于这的处理也比较简单,首要是这两个办法:
从代码逻辑上咱们能够看到,假如是sys.init.userspace_reboot.in_progress
这个值为true,那么就会运用userspaceRebootFiles
,假如当时是关机的话,那么会运用shutdownFiles
,最后才会运用bootFiles
。
从名字上咱们能够得知,第一种是在Android软启动的时分,才会运用的zipfile,这是关于Android软启动的介绍:
第二种则是Android关机的时分,才会运用的zipFile,第三种则是往常开机时分,运用的zipFile。
软启动时分,所寻觅的zip文件方位如下:
关机的时分,所寻觅的zip文件方位如下:
往常开机的时分,所寻觅的zip文件方位如下:
留意,从代码逻辑上能够看出,这些文件是有优先级的,比方假如同时存在/system/media/bootanimation.zip
和/product/media/bootanimation.zip
,那么会优先运用/product/media/bootanimation.zip
。
关于上面的这个playDarkAnim
,我找了半响也没找到ro.boot.theme
这个值是在哪设置的,看了下git hisotry,这个代码19年就在了,有知道的能够留言讨论一下。
How
现在现已知道咱们该把文件输出到哪里了,接下来咱们就要找到,这个文件是个什么格局。
关于Bootanimation Zip文件的格局,能够查看/frameworks/base/cmds/bootanimation/FORMAT.md
这个文件,里边详细介绍了该zip文件的格局以及咱们要预备的内容。
打开文件,咱们能够看到下面的内容:
那么从这儿面咱们能够知道,zip文件中的第一层结构,便是一个desc.txt
和一堆以part0
最初的文件夹,里边要放咱们的动画文件,也便是png格局的图片。
首要,咱们来看一下这个desc.txt
的详细描绘:
文件很长,而且有有些装备是可选的,咱们先写一个最简单的:
320 480 24
p 1 2 android
p 0 0 part1
留意,这儿我得目录名没有以part0最初,由于实践上在解析zip文件的时分,是先解析desc.txt,然后再去寻觅对应的目录。
然后这是我的zip第一层目录结构,和里边的png frame:
Do It
现在,咱们预备好了咱们的zip文件,就要想办法编译到咱们的android体系里边了。
首要,将bootanimation.zip
复制到/device/generic/goldfish/data/media
下面,接着,咱们修正/device/generic/goldfish/x86_64-vendor.mk
文件,从28行开始修正成如下指令:
PRODUCT_COPY_FILES +=
device/generic/goldfish/data/media/test/swirl_136x144_mpeg4.mp4:data/media/0/test/CtsMediaTestCases-1.4/swirl_136x144_mpeg4.mp4
device/generic/goldfish/data/media/test/swirl_132x130_mpeg4.mp4:data/media/0/test/CtsMediaTestCases-1.4/swirl_132x130_mpeg4.mp4
device/generic/goldfish/data/media/test/swirl_130x132_mpeg4.mp4:data/media/0/test/CtsMediaTestCases-1.4/swirl_130x132_mpeg4.mp4
device/generic/goldfish/data/media/test/swirl_144x136_mpeg4.mp4:data/media/0/test/CtsMediaTestCases-1.4/swirl_144x136_mpeg4.mp4
device/generic/goldfish/data/media/test/swirl_128x128_mpeg4.mp4:data/media/0/test/CtsMediaTestCases-1.4/swirl_128x128_mpeg4.mp4
device/generic/goldfish/data/media/bootanimation.zip:product/media/bootanimation.zip
能够看到,最后一行会在编译时,将咱们的zip文件复制到product/media
下面,从上面的代码剖析咱们能够知道,在这儿供给bootanimation.zip
也是可行的。
这样就完成了,接下来,咱们重新编译项目:
. build/envsetup.sh
lunch sdk_phone_x86_64
make
编译成功之后,假如在/out/target/product/emulator_x86_64/product/media
下面看到咱们的bootanimation.zip
,那么就说明咱们成功了:
之后运转模拟器:
emulator
最终咱们就会看到开机动画现已被修正了:
Opengl办法,修正开机动画
进入上面说过的android()
办法,咱们能够看到android运用opengl库进行制作:
假如需要经过OpenGL办法修正开机动画,能够不供给zip文件,直接在这儿进行修正。
留意,能够在源代码里边看到,android()办法制作开机动画时,android官方特意将其限制为12fps,这是为了不要制作的太快,避免影响CPU处理其它重要工作:
其它
bootanimation.zip增加音效
在描绘zip文件的FORMAT.md
,提到咱们能够为每个动画的part供给音效文件,这些音效会在开机时播放。
紧缩PNG帧
官方主张咱们将每一帧png图片尽量紧缩,而且提到了能够运用如下工具: