Android 平台自定义开机动画

上一节源码分析中我们知道,BootAnimation 会从以下几个目录中加载动画文件:

  • /system/media/bootanimation-encrypted.zip (if getprop("vold.decrypt") = '1')
  • /system/media/bootanimation.zip
  • /oem/media/bootanimation.zip

知道了这个,自定义开机动画的流程就出来了:

  • 构造好 bootanimation.zip 文件
  • 将 bootanimation.zip 文件预制到以上目录

那么这里就有几个问题了:

  • bootanimation.zip 中需要有哪些文件?
  • 这些文件怎么组织?
  • 怎么描述动画的流程

这些问题,bootanimation format 官方文档都做出了解答。但是文档比较严谨与正式化,理解上相对难一点。下面我用偏实践的方式给大家解析一下官方文档。

这里给出一个 bootanimation.zip 未压缩时的结构示例:

bash 复制代码
bootanimation/
├── desc.txt
├── part0
│   └── 000.png
├── part1
│   └── 001.png
└── part2
    └── 002.png

其中 part0 part1 part2 表示动画的每一个阶段,根据动画的复杂程度,可能还有 part3 part4 part5 等等。

每个 part 中,都保存有至少一张 png 图片。

desc.txt 是动画的脚本文件,用于描述动画的每个阶段,我们通过一个示例来了解其格式:

r 复制代码
1080 1920 60    # 宽x高=1080x192, fps=60帧
c 1 0 part0   # part0 只播放1次,但需全部图片都播放,不能打断
c 1 15 part1  # part1 只播放1次,但需全部图片都播放,不能打断,在播放结束时延迟15帧,即15/fps=1/60=1/4秒
p 0 0 part2   # part2 循环播放,直到系统启动完成,当 `service.bootanim.exit` 属性设置为 1 时,打断播放
  • 第一行:1080 1920 是动画区域的大小,单位是像素,60 是 60 帧每秒
  • 第二行:c 1 0 part0
    • 第一个参数 c 表示 service.bootanim.exit 属性设置为 1 时,动画不会被打断,第一个参数如果是 p,表示 service.bootanim.exit 属性设置为 1 时,动画会被打断
    • c 后面第 1 个参数:1 是播放一次, 0 表示无限循环直至开机完成。
    • c 后面第 2 个参数: 数字表示阶段(part)间隔时间,0 表示没有间隔时间
    • c 后面第 3 个参数:为对应的步骤文件夹
  • 后面几行和第二行类似

准备好以上的文件就可以打包了:

bash 复制代码
# 安装好 zip
sudo apt install zip
cd bootanimation/
zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip *.txt part*

执行完以上命令后,就可以在 bootanimation 的同级目录找到 bootanimation.zip 文件了。

接着我们把 bootanimation.zip 动画文件预制到 /system/media/ 目录下:

把 bootanimation.zip 动画文件移动到 device/jelly/rice14 文件中。

在我们的自定义 Product 配置文件 device/jelly/rice14/rice14.mk 中添加如下内容

makefile 复制代码
PRODUCT_COPY_FILES += \
     $(LOCAL_PATH)/bootanimation.zip:/system/media/bootanimation.zip

PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST +=\ 
    /system/media/bootanimation.zip

接着重新编译系统,启动虚拟机就可以看到自定义的开机界面了:

bash 复制代码
source build/envsetup.sh
lunch rice14-eng
m
emulator

参考资料

关于

我叫阿豪,2015 年本科毕业于国防科学技术大学指挥信息系统专业,毕业后从事信息化装备的研发工作,工作内容主要涉及 Android Framework 与 Linux Kernel。

如果你对 Android Framework 感兴趣或者正在学习 Android Framework,可以关注我的微信公众号和抖音,我会持续分享我的学习经验,帮助正在学习的你少走一些弯路。学习过程中如果你有疑问或者你的经验想要分享给大家可以添加我的微信,我拉你进技术交流群。

相关推荐
编程圈子26 分钟前
操作系统学习14 IDT + PIC + 键盘中断
android·学习·计算机外设
齊家治國平天下7 小时前
Android 14 Vehicle HAL (VHAL) 设计与实现深度解析
android·aaos·carservice·车载开发·android 14·vhal·vehicle hal
AFinalStone13 小时前
Android 7系统网络(八)应用API层—ConnectivityManager使用与实战调试
android·网络
plainGeekDev14 小时前
kapt 替换为 KSP
android·java·kotlin
蜡台14 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
阿pin17 小时前
Android随笔-SharedPreferences
android·sp
阿pin18 小时前
Android随笔-DataStore
android·datastore
茶栀(*´I`*)18 小时前
Android 测试入门指南:ADB 基础配置与常用设备管理命令解析
android·adb
ihuyigui20 小时前
海外酒店预订短信接口
android·java·运维·服务器·前端·后端·架构
gxgldyh21 小时前
Android Framework源码解析(七):BootAnimation 启动流程解析——开机动画是如何显示出来的?
android