本文将介绍怎样修正Android的开机动画,基于AOSP分支android-14.0.0_r28。

源码剖析

Android制作开机动画相关的代码,首要会集在frameworks/base/cmds/bootanimation/中,打开咱们能够看到如下的目录结构:

实战Android Framework: 修正开机动画

至于开机动画的实践制作,具体在BootAnimation.cpp中,其它的代码无需关心,要点要看从815行开始的代码:

实战Android Framework: 修正开机动画

从这儿咱们能够看到,这儿面做了一个判断,假如没有对应的zip file,那么会履行android(),假如没有,那么会履行movie()

实践上,当咱们查看两个办法的时分能够看到无论咱们运用哪种办法,最后实践上都是运用opengl来制作的,只是movie会读取对应zip文件中的图片来进行制作。

那么这儿咱们能够得出一个结论,咱们有两种办法来修正Android的开机动画,第一种,便是咱们供给给Android所需的zip文件,第二种,便是咱们直接运用opengl来手绘咱们的开机动画

BootAnimation Zip 文件办法修正开机动画

首要介绍最常用的一种办法,供给开机动画Zip文件。

Where

从上面的源码剖析,咱们现在第一步要做的,便是要找到这个mZipFileName是怎样赋值的。

实践上Android关于这的处理也比较简单,首要是这两个办法:

实战Android Framework: 修正开机动画

从代码逻辑上咱们能够看到,假如是sys.init.userspace_reboot.in_progress这个值为true,那么就会运用userspaceRebootFiles,假如当时是关机的话,那么会运用shutdownFiles,最后才会运用bootFiles

从名字上咱们能够得知,第一种是在Android软启动的时分,才会运用的zipfile,这是关于Android软启动的介绍:

source.android.com/docs/core/r…

第二种则是Android关机的时分,才会运用的zipFile,第三种则是往常开机时分,运用的zipFile。

软启动时分,所寻觅的zip文件方位如下:

实战Android Framework: 修正开机动画

关机的时分,所寻觅的zip文件方位如下:

实战Android Framework: 修正开机动画

往常开机的时分,所寻觅的zip文件方位如下:

实战Android Framework: 修正开机动画

留意,从代码逻辑上能够看出,这些文件是有优先级的,比方假如同时存在/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文件的格局以及咱们要预备的内容。

打开文件,咱们能够看到下面的内容:

实战Android Framework: 修正开机动画

那么从这儿面咱们能够知道,zip文件中的第一层结构,便是一个desc.txt和一堆以part0最初的文件夹,里边要放咱们的动画文件,也便是png格局的图片。

首要,咱们来看一下这个desc.txt的详细描绘:

实战Android Framework: 修正开机动画

文件很长,而且有有些装备是可选的,咱们先写一个最简单的:

320 480 24
p 1 2 android
p 0 0 part1

留意,这儿我得目录名没有以part0最初,由于实践上在解析zip文件的时分,是先解析desc.txt,然后再去寻觅对应的目录。

然后这是我的zip第一层目录结构,和里边的png frame:

实战Android Framework: 修正开机动画
实战Android Framework: 修正开机动画

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,那么就说明咱们成功了:

实战Android Framework: 修正开机动画

之后运转模拟器:

emulator

最终咱们就会看到开机动画现已被修正了:

实战Android Framework: 修正开机动画

Opengl办法,修正开机动画

进入上面说过的android()办法,咱们能够看到android运用opengl库进行制作:

实战Android Framework: 修正开机动画

假如需要经过OpenGL办法修正开机动画,能够不供给zip文件,直接在这儿进行修正。

留意,能够在源代码里边看到,android()办法制作开机动画时,android官方特意将其限制为12fps,这是为了不要制作的太快,避免影响CPU处理其它重要工作:

实战Android Framework: 修正开机动画

其它

bootanimation.zip增加音效

在描绘zip文件的FORMAT.md,提到咱们能够为每个动画的part供给音效文件,这些音效会在开机时播放。

实战Android Framework: 修正开机动画

紧缩PNG帧

官方主张咱们将每一帧png图片尽量紧缩,而且提到了能够运用如下工具:

实战Android Framework: 修正开机动画