安卓开机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.在所 ...
随机推荐
- SQL Merge 语法 单表查询
--项目中需要用到Merg语法,于是去网上查了资料,发现竟然都是多表查询,问题是我只有一张表,于是我纳闷了,后来我灵机一动,就搞定了!--表名:t_login(登录表)--字段:f_userName( ...
- 39-java中Arrays.sort 和 collections.sort()总结
总结一下java 中的两种排序工具: Arrays.sort() : 主要针对 数组类型排序,如果数组里面的元素是对象,要按对象属性排序的话,需要重写 Comparator() 函数,重写里面的 i ...
- idea工程中web.xml报错Servlet should have a mapping
搭建ssm工程过程中web.xml报错:Servlet should have a mapping ....但是mapping已经配置好了...如下图: 搜索无果,后来发现是工程的web.xml位置配 ...
- Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"
https://blog.csdn.net/saucyj/article/details/79043443
- 关于Vector,map等迭代器问题
vector.erase(it):后,it自动++,一定要弄清楚,删除成功后it指向删除的下一个地址. 对于map.erase(it),返回值为NULL,而Vector是返回itorator
- IntelliJ idea 的破解
·1.破解的jar包下载链接: https://pan.baidu.com/s/1JV6GwguGQNs5pNQtst29Hw 提取码: u2jd 2.安装和破解地址:https://www.cnb ...
- Java.Class
Class类 1. Class继承自Object. 2. .class 和 instance.getClass()的区别 Ref[1] Reference 1. .class http://stack ...
- Android.Zygote
Zygote进程 http://www.kaifazhe.com/android_school/397261.html http://anatomyofandroid.com/2013/10/15/z ...
- asp.net读取xml接口
//发送获取xml请求 public static string SentRequest(String url) { HttpWebRequest req = WebRequest.CreateHtt ...
- python——处理xls表格
因为工作需要,现有一个运营商导出的xls固定电话话费账单. 账单比较详细,而我最终需要的数据只有那个号码这个月用了多少话费的统计结果. 当年没有好好学office,以致于无从下手.泪奔/(ㄒoㄒ)/~ ...