实战Android Framework: 修改开机动画

本文将介绍如何修改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软启动的介绍:

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

第二种则是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的详细描述:

文件很长,而且有有些配置是可选的,我们先写一个最简单的:

css 复制代码
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行开始修改成如下指令:

make 复制代码
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也是可行的。

这样就完成了,接下来,我们重新编译项目:

bash 复制代码
. build/envsetup.sh
lunch sdk_phone_x86_64
make

编译成功之后,如果在/out/target/product/emulator_x86_64/product/media下面看到我们的bootanimation.zip,那么就说明我们成功了:

之后运行模拟器:

bash 复制代码
emulator

最终我们就会看到开机动画已经被修改了:

Opengl方式,修改开机动画

进入上面说过的android()方法,我们可以看到android使用opengl库进行绘制:

如果需要通过OpenGL方式修改开机动画,可以不提供zip文件,直接在这里进行修改。

注意,可以在源代码里面看到,android()方法绘制开机动画时,android官方特意将其限制为12fps,这是为了不要绘制的太快,防止影响CPU处理其它重要工作:

其它

bootanimation.zip增加音效

在描述zip文件的FORMAT.md,提到我们可以为每个动画的part提供音效文件,这些音效会在开机时播放。

压缩PNG帧

官方建议我们将每一帧png图片尽量压缩,并且提到了可以使用如下工具:

相关推荐
爱笑鱼2 小时前
Binder(八):远端进程死了,BinderProxy 为什么还能收到通知?
android
Android-Flutter2 小时前
Kotlin 冷流与热流详解
android·kotlin
zhangphil2 小时前
Android ContentProvider/ContentResolver读图片,跨进程 IPC慢
android
yueqc12 小时前
Android .so 文件压缩
android·so·包体积
龚礼鹏3 小时前
深入解析 Android Automotive (AAOS) 启动流程与 CarService 核心机制(基于 Android 16 最新源码视角)
android
rosmis3 小时前
agent各指标定义
android·java·开发语言
风样滴男人哟4 小时前
PHP特性之反射类ReflectionClass机制
android·开发语言·php
小孔龙5 小时前
RenderNode 与 DisplayList:Android 硬件加速的绘制记录与复用
android·性能优化
qizayaoshuap5 小时前
鸿蒙 ArkTS 实战:搜索列表 城市实时过滤(示例 94)
android·华为·harmonyos
朝星6 小时前
Framework筑基之Handler消息机制5(应用层)
android