安卓开机动画

目录


一、开机动画的2种模式

一种是使用两张图片利用某种效果来造成动态,另一种则是用一个图包循环显示的方式来形成动态。当然,这时因为mediaplayer已经起来,播放开机动画的时候可以同时播放开机音乐。

第一种双图片模式称为android模式

第二种图包模式称为movie模式

他们在循环时通过条件变量来选择其一:

java 复制代码
if (mAndroidAnimation) {

r = android(); //Android原生的经典开机动画

} else {

r = movie(); //用户客户自定开机动画

}

1.1 android模式

第一种android模式:
BootAnimation.cpp

c++ 复制代码
initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png");
initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png");

这两张图片都在frameworks/base/core/res/assets/images目录下,替换即可。

使用美女替换一下:

2.2 movie模式

这个用户可以自定义,也就是在打包时通过.mk文件拷贝到system/media中。


二、开机动画代码运行位置

frameworks/base/cmds/bootanimation

bootanimation/

├── Android.mk 编译脚本

├── audioplay.cpp 音频播放

├── AudioPlayer.cpp 播放器

├── AudioPlayer.h

├── audioplay.h

├── BootAnimation.cpp 开机动画播放主流程,重点关注

├── BootAnimation.h

├── bootanimation_main.cpp init启动过程注册服务文件

├── bootanim.rc Android新版本,服务启动方式

└── FORMAT.md 说明文档,markdown格式

三、删除开机动画

java 复制代码
bool bootAnimationDisabled() {
      char value[PROPERTY_VALUE_MAX];
      property_get("debug.sf.nobootanimation", value, "0");
      if (atoi(value) > 0) {
          return true;
      }

将 property_get("debug.sf.nobootanimation", value, "0");改为property_get("debug.sf.nobootanimation", value, "1")即可,即无法进入到movie开机动画流程中。

四、自定义开机动画实践

frameworks\base\cmds\bootanimation\ BootAnimation.cpp

动画文件的存在位置,内部使用OpenGL渲染

c++ 复制代码
static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";
static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimation-dark.zip";
static const char PRODUCT_BOOTANIMATION_FILE[] = "/product/media/bootanimation.zip";
static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip";
static const char APEX_BOOTANIMATION_FILE[] = "/apex/com.android.bootanimation/etc/bootanimation.zip";
static const char PRODUCT_ENCRYPTED_BOOTANIMATION_FILE[] = "/product/media/bootanimation-encrypted.zip";
static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootanimation-encrypted.zip";
static const char OEM_SHUTDOWNANIMATION_FILE[] = "/oem/media/shutdownanimation.zip";
static const char PRODUCT_SHUTDOWNANIMATION_FILE[] = "/product/media/shutdownanimation.zip";
static const char SYSTEM_SHUTDOWNANIMATION_FILE[] = "/system/media/shutdownanimation.zip";

动画文件的读取是按顺序进行的,如果读取成功,则不再读取后续的文件,如果失败,则读取下一个文件。

首先判断自定义的开机动画文件mZipFileName是否存在,如果存在就调用movie()完成自定义开机画面的显示;

如果不存在,调用android()完成系统默认开机画面的显示。

开机动画包bootanimation.zip

每个压缩文件都必须包含有一个名称为"desc.txt"的文件,这是用来描述用户自定义的开机动画是如何显示的。

480 640 20

p 1 0 folder1

p 2 20 folder2

c 0 0 folder3

c 1 0 folder4

第1行用来描述开机动画在屏幕显示的大小及帧率。具体为:开机动画的宽度为480个像素,高度为640个像素,显示频率为每秒20帧,即每帧显示1/20秒。

下面的每一行代表一个片段,显示的时候会按照顺序从上到下依次显示。

第1个字符为片段类型,有'c'和'p'两种;

第2个数字为该片段重复显示的次数,如果为'0',表示会无限重复显示;

第3个数字为两次显示之间的间隔,单位为第一行中定义的每帧显示的时间;

第4个字符串为该片段所在的文件夹,一个片段可以由多个png图片组成,都存放在folder文件夹中;

解释一下:

"p 1 0 folder1"------代表该片段显示1次,与下一个片段间隔0s,该片段的显示图片路径为bootanimation.zip/folder1;

"p 2 20 folder2"------代表该片段显示2次,且两次之间显示的间隔为20(1/20)=1s,与下一个片段间隔20(1/20)=1s,该片段的显示图片路径为bootanimation.zip/folder2;

"c 0 0 folder3"------代表该片段无限循环显示,且两次显示的间隔为0s,与下一个片段间隔0s,该片段的显示图路径为bootanimation.zip/folder3;

"c 1 10 folder4"------代表该片段显示1次,显示后暂停10*(1/20)=0.5s,该片段的显示图路径为bootanimation.zip/folder4;

实验步骤为

源码里将bootanimation.zip文件替换成自己想要的。

或者

1.adb root

2.adb remount

3.adb push D:\bootanimation.zip /system/media/

4.adb reboot

相关推荐
百锦再36 分钟前
Android Studio开发 SharedPreferences 详解
android·ide·android studio
青春给了狗1 小时前
Android 14 修改侧滑手势动画效果
android
CYRUS STUDIO1 小时前
Android APP 热修复原理
android·app·frida·hotfix·热修复
火柴就是我2 小时前
首次使用Android Studio时,http proxy,gradle问题解决
android
limingade2 小时前
手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段
android·智能手机·电脑·蓝牙电话·电脑打电话
浩浩测试一下2 小时前
计算机网络中的DHCP是什么呀? 详情解答
android·网络·计算机网络·安全·web安全·网络安全·安全架构
青春给了狗4 小时前
Android 14 系统统一修改app启动时图标大小和圆角
android
pengyu4 小时前
【Flutter 状态管理 - 柒】 | InheritedWidget:藏在组件树里的"魔法"✨
android·flutter·dart
居然是阿宋6 小时前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
凉、介6 小时前
PCI 总线学习笔记(五)
android·linux·笔记·学习·pcie·pci