安卓开机logo和开机动画的几种实现方法
安卓4.2可用方法2-4,第一种方法未验证。
从理论上来说,android 有4个开机启动画面。
第一个应该是U-BOOT的启动画面,有些设备为了满足按动电源即有显示,在UBOOT里加了开机画面,实现的方式当然只能是写物理地址,也因此随厂家不同具体的实现千差万别。加上我们接触的手机平板等设备大多没这个开机画面,所以这里就不赘述了。
第二个启动画面实际是LINUX的启动画面,但这个启动画面在ANDROID里默认是关闭的,需要打开时就打开kernel选项:
CONFIG_FRAMEBUFFER_CONSOLE
CONFIG_LOGO
意即KERNEL支持帧缓冲控制台,并且显示开机LOGO。
最方便的办法当然是make menuconfig。
第一个对应的配置菜单项为:Device Drivers ---> Graphics support ---> Console display driver support ---> Framebuffer Console support。
第二个对应的配置菜单项为:Device Drivers ---> Graphics support ---> Bootup logo。
具体执行第一个动画的文件在 kernel/drivers/video/fbmem.c
里面有fb_prepare_logo函数,负责LOAD 开机画面。这个函数会调用kernel/drivers/video/logo/logo.c的fb_find_logo函数来确认最终会用哪张图片。
开机的图片也都在kernel/drivers/video/logo/ 目录下,要注意这些图片不是标准的PNG等格式,网上提供了工具来进行转换为所需的PPM格式,这里就不赘述了。
第三个开机画面已经进入了android的范围,是在INIT进程启动的时候加载的。
具体来说,是在system/core/init/init.c 里干的。
queue_builtin_action(console_init_action, "console_init");
console_init_action函数中有一行:
load_565rle_image(INIT_IMAGE_FILE)
这个函数简单说就是显示了一张图,图的路径在INIT_IMAGE_FILE。
INIT_IMAGE_FILE的定义是在system/core/init/init.h:
#define INIT_IMAGE_FILE "/initlogo.rle"
这个rle文件一般放在device目录下,可以自己用命令搜寻。网上也有工具提供各种图片对这个RLE格式的转换。
第四个开机画面,是我们最常见的安卓手机开机画面。从实现方式来说,其实就是在init.rc里添加了一个bootAnimation的服务,这个服务不是自动运行的,它有一定的运行条件,具体可以参看下它的定义:
service bootanim /system/bin/bootanimation
class main
user graphics
group graphics
disabled
oneshot
service shutdownanim /system/bin/bootanimation -shutdown
class main
user graphics
group graphics
disabled
oneshot
什么时候它会被执行呢?简单说,就是surfaceFlinger启动的时候,会改变系统变量让它起来,而系统完成启动后(launcher已经起来了),activityManagerService会辗转通知surfaceFlinger,然后又用改变系统属性的办法关闭bootanimation进程。
如上所述,我们就理解了bootanimation是一个循环执行的进程。它的代码在:
frameworks/base/cmds/bootanimation/BootAnimation.cpp
从代码可知这次开机动画有2种模式,一种是使用两张图片利用某种效果来造成动态,另一种则是用一个图包循环显示的方式来形成动态。当然,这时因为mediaplayer已经起来,播放开机动画的时候可以同时播放开机音乐。第一种双图片模式称为android模式,第二种图包模式称为movie模式,他们在循环时通过条件变量来选择其一:
if (mAndroidAnimation) {
r = android();
} else {
r = movie();
}
这两种模式具体的实现动画的代码比较简单,就不讨论了,只看定义需要的文件之处:
第一种android模式:
initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png");
initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png");
这两张图片都在frameworks/base/core/res/assets/images目录下,替换即可。
第二种movie模式:
mZip.open(USER_BOOTANIMATION_FILE) == NO_ERROR)
mZip.open(SYSTEM_BOOTANIMATION_FILE) == NO_ERROR)
#define USER_BOOTANIMATION_FILE "/data/local/bootanimation.zip"
#define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip"
找到并替换bootanimation.zip即可。
安卓开机logo和开机动画的几种实现方法的更多相关文章
- 安卓修改开机logo和开机动画的方法
第一种和第二种方法亲测可用,安卓版本是4.2和安卓5.1均可.第二种方法待验证 以下三种方法 Android 开机其实总共会出现3个画面: 1.第一个就是 linux 系统启动,出现Linux小企鹅画 ...
- DIY固件系列教程——实现开机LOGO三屏动画的完全替换【转】
本文转载自:http://blog.csdn.net/sdgaojian/article/details/9192433 本教程需要用到如下工具:1,7Z压缩工具2,AddCrc32效验工具3,raw ...
- Android5.1开机LOGO与开机动画【转】
本文转载自:http://blog.csdn.net/u014770862/article/details/52624627 android5.1中,开机LOGO部分和之前版本的并不相同,主要区别在于 ...
- android缩放动画的两种实现方法
在android开发.我们会常常使用到缩放动画,普通情况下缩放动画有两种实现方式.一种是直接通过java代码去实现,第二种是通过配置文件实现动画,以下是两种动画的基本是用法: Java代码实现: // ...
- IOS实现动画的几种简单方法
1.使用 NSTimer 来实现 [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(setNeed ...
- 暂停和播放CSS3动画的两种实现方法
1,直接修改animationPlayState <!DOCTYPE html> <html> <head lang="en"> <met ...
- Android系统移植与调试之------->如何修改开机动画的两种方式剖析
首先,我们先来分析一下源码: frameworks/base/cmds/bootanimation/BootAnimation.cpp 首先看一下定义的常量: BootAnimation::ready ...
- 设置安卓开机动画、开机logo
我们要修改的是system>media文件夹下的bootanimation.zip(手机开机动画)这个文件 先来讲讲这个文件结构:该zip解压后得到两个文件, 第一个目录存放了开机时播放的图片( ...
- 开机logo以及两种修改开机动画方法
Android开机画面总共有三屏 一.第一屏:开机logo 1.选张png格式的图片,在Linux任意下执行(安装工具): sudo apt-get install pnmtoplainpm 2.在所 ...
随机推荐
- 2017.9.26JQuery源码解析一 架构与依赖
jq1.0: css选择符 事件处理 ajax交互 1.2.3: 引入数据缓存,解决循环引用与大数据保存问题 1.3. : 使用全新的选择器引擎sizzle,在各个浏览器下全面超越其他同类js ...
- Non-negative Integers without Consecutive Ones
n位二进制,求不包含连续1的二进制(n位)数字个数. http://www.geeksforgeeks.org/count-number-binary-strings-without-consecut ...
- ios证书安装和打包流程
iOS开发流程 1.拿到源文件 2文件目录大致名字 一.证书配置 参考网站:http://www.jianshu.com/p/9d9e3699515e (证书配置参考地址) 准备工作 首先要有苹 ...
- 偷懒把本来要判断输入值的textbox 输出提示值,结果点两次程序异常
调试程序是苦并快乐着的事, 为防止用户直接点击导入下表,于是我设置提示,点击时先判断textbox 里边有无值,为空的话也在textbox做提示 程序如下: 点一次可以正常输出到textbox中,点第 ...
- C# 一个数组未赋值引发的错误
在电脑前又是一天,后来脑子也糊里糊涂,可能是基础还不牢固,设置断点,找了找问题才发现数组定义出了问题, 我是这样定义数组的,string[] auths ; string auths=new stri ...
- c++ 备忘
一.类型转换#include <sstream>stringstream ss;ss<<reverse(s1)<<'\t'<<reverse(s2);s ...
- (转)在WCF服务的ServiceReferences.ClientConfig中使用相对路径
问题: Silverlight项目中添加服务引用后会在Silverlight项目中生成一个ServiceReferences.ClientConfig文件,这个文件中包含了引用服务的绑定(bindin ...
- Job for apache2.service failed because the control process exited with error code. See "systemctl status apache2.service" and "journalctl -xe" for details.
环境:Ubuntu 16.04.1 + Django 1.11.15 + Apache 2.4.18 + python 3.5 此篇文章内容提到的第几步,对照以下链接中的步骤 百度云的ubuntu1 ...
- Yii2 数据操作Query Builder查询数据
Query Builder $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name']) ->from('zs_dynast ...
- compatible with
和系统函数冲突