安卓开机动画

目录


一、开机动画的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

相关推荐
天空之城--5 小时前
Android逆向安全合规接单指南
android·安全
消失的旧时光-19437 小时前
Android 系统层扫盲 09:AMS、ATMS、WMS、PMS 到底分别管什么?
android·wms·pms·ams·aosp·atms
Godikov7 小时前
Android 系统级设备应用踩坑实录:sharedUserId 签名、SDK 授权失败 -4、开机自启与 U 盘 OTA 升级
android
IT毕设实战小研10 小时前
基于大数据的国内主要农作物产量趋势分析与可视化
android·java·大数据·django·课程设计
企业数字化笔记11 小时前
固定资产历史数据怎么导入系统?Excel模板、字段映射和数据校验
android·java·数据库·后端
龙之叶12 小时前
Android出海系列-GMS认证介绍
android
潮族大Z12 小时前
Android性能优化:启动、内存、卡顿的一站式排查手册
android
事圆则缓13 小时前
从suspend字节码到 Retrofit 协程桥:挂起函数识别与恢复
android·retrofit
杉氧14 小时前
RN 性能调优指南:重渲染(Re-renders)控制与长列表(FlatList)优化
android·前端·react native
Coffeeee14 小时前
claude-video 一个让你的Agent拥有看视频能力的Skill
android·人工智能·aigc