安卓系统定制开机动画
扫描二维码
随时随地手机看文章
点击上方蓝字关注我哦~
01
前言
前一篇文章中简述了如何修改开机logo,本篇来介绍如何修改开机动画。
02
开机动画的显示原理
Android系统开机动画, 是由bootanimation进程将一组逐帧的图片按次序循环播放,从而形成形成的动画效果。
bootanimation启动
bootanimation是一个native进程,由c++编写,在开机的过程中由init进程启动。
/init.rc
service bootanim /system/bin/bootanimation class core
user graphics
group graphics audio
disabled
oneshot
在SurfaceFlinger.cpp启动时在初始化init()函数里会调用startBootAnim()。
void SurfaceFlinger::startBootAnim() {
property_set("service.bootanim.exit", "0");
property_set("ctl.start", "bootanim");
}
同时设置了两个系统属性:service.bootanim.exit和ctl.start。
init进程检测到ctl.start被设成bootanim后,
就会再去init.rc里找bootanim的service, 然后启动/system/bin/bootanimation进程。
bootanimation实现
bootanimation代码目录在
frameworks/base/cmds/bootanimation/里。功能实现主要在BootAnimation.cpp文件里。
Bootanimation继承于Thread(), 所以bootanimation显示的主要部分在threadLoop()函数里。
bool BootAnimation::threadLoop()
{
bool r; if (mZip == NULL) {
r = android();
} else {
r = movie();
}
…
return r;
}
mZip表示桢动画的zip文件对象,优先级依次是
”/system/media/bootanimation-encrypted.zip”
“/system/media/bootanimation-encrypted.zip”
”/system/media/bootanimation.zip”
如果这三个文件全都不存在,就会调用android()函数,也就是原生的”android”几个字母滚动的动画。如果其中任何一个zip文件存在,则调用movie()函数,这里面会解压zip包,然后在一个while循环里显示,也就是看到的动画效果。
bootanimation退出
开机动画显示都是在一个死循环里,当系统启动完成之后,必须要退出bootanimation, 然后显示launcher桌面。
当Android系统启动完成发送boot_complete广播的同时,会调用SurfaceFlinger.cpp的bootFinished()函数。在bootanimation进程的android()或者movie()里都会循环调用checkExit()函数检测“service.bootanim.exit”的值;
当”service.bootanim.exit”的值为1时,调用requestExit()便会通知线程需要结束,也就退出了动画播放。Android系统开机动画就结束了。
03
开机动画的制作
创建 bootanimation.zip 文件,该压缩包文件里存放有逐帧动画和控制脚本,通过连续切换显示图片达到动画的效果。
bootanimation.zip压缩包文件结构:
desc.txt 动画属性描述文件
part0 第一阶段动画图片目录
part1 第二阶段动画图片目录
制作方法:
(1)将第一部分图片按播放顺序命名好,保存在part0的文件夹中,
例如:001.jpg、002.jpg。实测图片格式为png或bmp也可。
(2)将第二部分图片按播放顺序命名好,保存在part1的文件夹中,
例如:001.jpg、002.jpg
(3) desc.txt 的文档:
800 1280 12
p 1 0 part0
p 0 10 part1
第一行:图片属性800(宽度) 1280(高度) 12(每秒显示帧数) 无
第二行:第一阶段动画属性 p(默认标志符) 1(循环次数为1) 0(进入该阶段的间隔时间 part0(该阶段图片的存放目录)
第三行:第二阶段动画属性 p(默认标志符) 0(无限循环)10(进入该阶段的间隔时间)part1(该阶段图片的存放目录)
每秒显示帧数:每秒显示的图片数量。
间隔时间:该阶段结束后间隔多久进入下一阶段显示,单位为每张图片的显示时间。
如果并没有两个阶段的动画,可以只有一个文件夹。并且在desc.txt只描述一个。如本例:
Part目录就三张滚动的图片。
desc.txt内容
800 1280 1
p 0 0 part
1秒刷新一张且无限循环。
(4) 选中part0、part1和desc.txt进入自定义压缩,压缩文件格式为 zip,压缩方式为存储,命名为bootanimation.zip。注意选择文件时为多选,而不是选择desc.txt上一级的目录。
(5) push验证。将生成的bootanimation.zip push到/system/media/目录下,重启验证。
(6) 将压缩包拷贝到 device/*/$(TARGET_DEVICE) 目录下。
例如:RK3399 的目录在
device/rockchip/rk3399/bootanimation.zip
(7) 修改
device/*/$(TARGET_DEVICE)/$(TARGET_DEVICE).mk 文件。
例如:
RK3399 是 device/rockchip/rk3399/rk3399.mk中添加。
PRODUCT_COPY_FILES += device/rockchip/rk33399/bootanimation.zip:system/media/bootanimation.zip
表示将zip拷贝到system/media/目录内。
(8) 编译system.img,烧录即可。
/ The End /
推荐阅读
安卓系统定制开机logo图片
本文由【嵌入式案例Show】原创出品,未经许可,请勿转载
扫码关注我们
看更多嵌入式案例
喜欢本篇内容请给我们点赞、在看
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!