当前位置: 首页 > news >正文

Android 开机动画支持mp4格式视频播放

前 言

Android系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段。无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的。

自定义开关机动画/视频

关于开机动画的流程主要代码在 framebuffer/base/cmds/bootanimation/bootAnimation.cpp
BootAnimation::threadLoop() 中我们可以看到

if(mZip == NULL) {    r = android();} else {r = movie();
}

根据 mZip(这是一个叫做 bootanimation.zip 的文件)是否存在,决定调用 android() 接口还是 movie() 接口。

android() :
如果没有 zip 文件进入的就是这种方式。会加载”images/android-logo-mask.png”和”images/android-logo-shine.png” 这两张图片,前者是镂空的 ANDROID 字样,后者是一副很长的银白黑渐进的背景图,通过固定前者,移动后者,实现 ANDROID 字样的反光效果。
想修改android闪动的那两张图片的话,最简单的方法是直接替换图片(图片在 /frameworks/base/core/res/assets/images),如果懂 openGL 的话也可以自己做酷炫的动画。
movie() :
如果有 bootanimation.zip 文件进入的就是这种方式。会加载 bootanimation.zip 中的内容。zip 文件中实际是很多帧图片的组合,通过多帧图片的逐步播放实现动画的效果。所以把做好的动画拷贝到编译好对应的目录下即可。
#define SYSTEM_BOOTANIMATION_FILE “/system/media/bootanimation.zip”
开机动画的退出
开机动画的退出是靠 property 即 #define EXIT_PROP_NAME “service.bootanim.exit” 来判断的,见函数checkExit() 。

//BootAnimation.cpp
void BootAnimation::checkExit() {if(mShutdown){return ;}// Allow surface flinger to gracefully request shutdownchar value[PROPERTY_VALUE_MAX];property_get(EXIT_PROP_NAME, value, "0");int exitnow = atoi(value);if (exitnow) {requestExit();if (mAudioPlayer != NULL) {mAudioPlayer->requestExit();}}
}

而设置个property的地方是在 SurfaceFlinger.cpp

void SurfaceFlinger::bootFinished()
{const nsecs_t now = systemTime();const nsecs_t duration = now - mBootTime;ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );mBootFinished = true;// wait patiently for the window manager deathconst String16 name("window");sp<IBinder> window(defaultServiceManager()->getService(name));if (window != 0) {window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));}// stop boot animation// formerly we would just kill the process, but we now ask it to exit so it// can choose where to stop the animation.property_set("service.bootanim.exit", "1");
}

当显示模块boot完成后,会调用 property_set(“service.bootanim.exit”, “1”); 告诉 bootanimation 模块退出动画显示。

添加 mp4格式视频作为开机动画的过程

  1. 修改 ThreadLoop 中的判断(framebuffer/base/cmds/bootanimation/bootAnimation.cpp)
    if (mVideo) {r = video();} else if (mZipFileName.isEmpty()) {r = android();} else {r = movie();}
  1. 我们在 ReadyToRun 中实现 mVideo 的判断
    ... ...mFlingerSurface = s;mTargetInset = -1;/* add start */mVideo = false;mVideoFileName = "";SLOGE("mShuttingDown = %d ", mShuttingDown);if (access(!mShuttingDown ? SYSTEM_BOOTVIDEO_FILE : SYSTEM_SHUTDOWNVIDEO_FILE, R_OK) == 0) {mVideo = true;mVideoFileName = !mShuttingDown ? SYSTEM_BOOTVIDEO_FILE : SYSTEM_SHUTDOWNVIDEO_FILE;SLOGD("mVideoFileName string is %s, length is %zu", mVideoFileName.string(), mVideoFileName.length());}/* add end */SLOGD("Get Surface mWidth is %d,mHeight is %d",mWidth,mHeight);return NO_ERROR;
}
static const char SYSTEM_BOOTVIDEO_FILE[] = "/system/media/bootvideo.mp4";
static const char SYSTEM_SHUTDOWNVIDEO_FILE[] = "/system/media/shutdownvideo.mp4";
  1. 实现 video 接口
bool BootAnimation::video(){eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);eglDestroySurface(mDisplay, mSurface);const char* boot_videofile = "/system/media/bootvideo.mp4";int fd = open(boot_videofile, O_RDONLY);sp<MediaPlayer> mediaplayer = new MediaPlayer();mediaplayer->reset();mediaplayer->setDataSource(fd, 0, 0x7ffffffffffffffLL);mediaplayer->setLooping(false);mediaplayer->setVideoSurfaceTexture(mFlingerSurface->getIGraphicBufferProducer());mediaplayer->prepare();mediaplayer->start();while(true) {if(exitPending())break;usleep(100);if(!mediaplayer->isPlaying())checkExit();}mediaplayer->stop();mediaplayer->release();return false;
}
  1. BootAnimation.h 中新增变量和函数
class BootAnimation : public Thread, public IBinder::DeathRecipient
{
...
private:
...bool        mVideo;String8     mVideoFileName;int         mVideofd;bool        video();
...
  1. Android.bp 中确保要加入 libmedia
shared_libs: ["libui","libhwui","libEGL","libGLESv1_CM","libgui","libtinyalsa","libmedia",],
  1. 在 /system/media/ 中添加 bootvideo.mp4、shutdownvideo.mp4 后重启就可以看到开关机视频了。

相关文章:

Android 开机动画支持mp4格式视频播放

前 言 Android系统在启动的过程中&#xff0c;最多可以出现三个画面&#xff0c;每一个画面都用来描述一个不同的启动阶段。无论是哪一个画面&#xff0c;它们都是在一个称为帧缓冲区&#xff08;frame buffer&#xff0c;简称fb&#xff09;的硬件设备上进行渲染的。 自定义…...

软考A计划-试题模拟含答案解析-卷十

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…...

Kafka入门(安装和SpringBoot整合)

文章目录 一、Docker安装Kafka1. 创建网络2. 安装zookeeper3. 安装Kafka 二、Kafka介绍1. Kafka简介 三、SpringBoot整合Kafka1. 引入pom依赖2. application.propertise配置3. Hello Kafka(Producer)4. Consumer Kafka5. 带回调的生产者6. 自定义分区器7. kafka事务提交8. 指定…...

gitLab相关命令

gitLab相关命令 1) 远程仓库相关命令 git clone 远程仓库地址 #检出仓库git remote -v #查看远程仓库git remote add [name][url] #添加远程仓库&#xff0c;git remote add origin 远程仓库地址git remote rm [name] #删除远程仓库&#xff0c;git remote rm origingit remo…...

一些查看日志时的常用命令

文章目录 1、grep -r 搜索内容 *2、l * 关键字 *3、tail -f 文件名4、tail -n X 文件名5、cat 文件名 | grep "关键字" -C X同理可得&#xff0c;-A同理可得&#xff0c;-B 一些查看日志时的常用命令 1、grep -r 搜索内容 * 作用&#xff1a;在一堆文件里&#xff0…...

Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

执行环境有全局执行环境和函数执行环境之分&#xff0c;每次进入一个新执行环境&#xff0c;都会创建一个搜索变量和函数的作用域链。函数的局部环境不仅有权访问函数作用于中的变量&#xff0c;而且可以访问其外部环境&#xff0c;直到全局环境。全局执行环境只能访问全局执行…...

CRDT协同算法

CRDT的英文全称是Conflict-free Replicated Data Type&#xff0c;最初是由协同文本编辑和移动计算而发展的&#xff0c;现在还被用作在线聊天系统、音频分发平台等等。当前CRDT算法在富文本编辑器领域的协同依旧是典型的场景&#xff0c;常用于作为实现文档协同的底层算法&…...

近代中国的三次思想文化运动

1、戊戌变法中维新派顽固派论战 第一次思想解放潮流是1898年维新派与顽固势力的论战。论战的内容有&#xff1a;要不要变法&#xff0c;要不要兴民权、实行君主立宪&#xff0c;要不要提倡西学、改变教育制度。此次论争是资本主义思想同封建主义思想的正面交锋&#xff0c;此后…...

《地铁上的面试题》--目录

第一部分&#xff1a;基础 数据结构与算法 1.1 数组和链表 1.2 栈和队列 1.3 树和图 1.4 排序和搜索算法 1.5 动态规划和贪心算法 操作系统 2.1 进程与线程 2.2 内存管理 2.3 文件系统 2.4 进程同步与通信 2.5 虚拟化和容器化技术 计算机网络 3.1 TCP/IP协议 3.2 HTTP和HTTPS…...

在VIVADO下烧写ZC706板载FLASH的操作步骤

1&#xff0c;原理图分析 首先看原理图&#xff0c;我们兼容ZC706的板子有两片 FLASH&#xff0c;型号是S25FL128A,连接方式如下&#xff1a; 可以看到两片是分别接在了XC7Z045芯片的引脚上&#xff0c;是互不相干的并联方式&#xff0c;每个FLASH芯片支持X4模式&#xff0c;也…...

第二期:链表经典例题(两数相加,删除链表倒数第N个节点,合并两个有序列表)

每道题后都有解析帮助你分析做题&#xff0c;答案在最下面&#xff0c;关注博主每天持续更新。 PS&#xff1a;每道题解题方法不唯一&#xff0c;欢迎讨论&#xff01; 1.两数相加 题目描述 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式…...

ESP32设备驱动-SHT35湿度传感器驱动

SHT35湿度传感器驱动 1、SHT35介绍 SHT35 数字温湿度传感器基于 Sensirion SHT35 传感器 IC。 得益于Sensirion的CMOSens技术,高度集成的电容式湿度传感元件和带隙温度传感元件,SHT35具有高可靠性和长期稳定性,功耗低,响应速度快,抗干扰能力强。 传感器支持IIC通信,兼容…...

如何快速判断GitLab 是否出现 OOM

查看系统日志&#xff1a; 使用 dmesg 命令来查看系统日志&#xff0c;搜索 Out of memory 关键字&#xff1a; sudo dmesg | grep -i "out of memory"如果输出结果中包含 Out of memory 或 oom-killer 等关键字&#xff0c;则表示系统出现了 OOM。 查看 GitLab 日…...

Word查找和替换通配符(完全版)

Word查找栏代码通配符一览表 序号 清除使用通配符复选框 勾选使用通配符复选框 特殊字符 代码 特殊字符 代码or通配符 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^# 任意数字&#xff08;单个&#xff09; [0-9] 3 任意英文字母 ^$ 任意英文字母 [a…...

Linux下socketpair系统API调用使用说明

目录 1.socketpair函数说明 2.socketpair使用举例 在阅读nginx源码时&#xff0c;发现其调用socketpair来实现master和worker进程之间进行数据交互。其代码如下&#xff1a; 思考&#xff1a;master和worker进程是父子关系&#xff0c;有亲属关系的进程通过pipe/pipe2&#x…...

【Netty】Future 源码分析(十六)

文章目录 前言一、JDK 的 Future 接口二、Netty 的 Future 接口三、ChannelFuture 接口总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff09;Netty 架构设计&#xff08;二&#xff09;Netty Channel 概述&#xff08;三&#xff09;Netty Channel…...

5月《中国数据库行业分析报告》正式发布,首发时序、实时数据库两大【全球产业图谱】

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…...

【计算机视觉 | 目标检测】术语理解6:ViT 变种( ViT-H、ViT-L ViT-B)、bbox(边界框)、边界框的绘制(含源代码)

文章目录 一、ViT & ViT变种1.1 ViT的介绍1.2 ViT 的变种 二、bbox&#xff08;边界框&#xff09;三、边界框的绘制 一、ViT & ViT变种 1.1 ViT的介绍 ViT&#xff0c;全称为Vision Transformer&#xff0c;是一种基于Transformer架构的视觉处理模型。传统的计算机视…...

为kong网关添加限流插件

限流用于控制发送到上游服务的请求速率。 它可用于防止 DoS 攻击、限制网络抓取和其他形式的过度使用。 如果没有速率限制&#xff0c;客户可以无限制地访问您的上游服务&#xff0c;这可能会对可用性产生负面影响。 一、全局范围内的限流 1、启用限流 [rootmin ~]# curl -i…...

Python接口自动化—接口测试用例和接口测试报告模板

简介 当今社会在测试领域&#xff0c;接口测试已经越来越多的被提及&#xff0c;被重视&#xff0c;而且现在好多招聘信息要对接口测试提出要求。区别于传统意义上的系统级别测试&#xff0c;很多测试人员在接触到接口测试的时候&#xff0c;也许对测试执行还可以比较顺利的上…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...