android_android4.0.3修改启动动画和开机声音

1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片);
2. Android平台启动初始化,出现"A N D R I O D"文字字样画面;
3. Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。

现在我们说的是第三种方式(基于模拟器):

android开机动画叫源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/bootanimation.zip或/system/media/bootanimation.zip里面的png图片以动画的形式播放出来。

首先,我们先来分析一下源码:

frameworks/base/cmds/bootanimation/BootAnimation.cpp

首先看一下定义的常量:

1
2
3
4
#define USER_BOOTANIMATION_FILE "/data/local/bootanimation.zip"
 
#define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip"
#define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/bootanimation-encrypted.zip"

BootAnimation::readyToRun()

进入一个if判断语句

1
2
3
4
5
6
7
8
9
10
11
if ((encryptedAnimation &&
             (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) = = 0 ) &&
             (mZip. open (SYSTEM_ENCRYPTED_BOOTANIMATION_FILE) = = NO_ERROR)) ||
 
             ((access(USER_BOOTANIMATION_FILE, R_OK) = = 0 ) &&
             (mZip. open (USER_BOOTANIMATION_FILE) = = NO_ERROR)) ||
 
             ((access(SYSTEM_BOOTANIMATION_FILE, R_OK) = = 0 ) &&
             (mZip. open (SYSTEM_BOOTANIMATION_FILE) = = NO_ERROR))) {
         mAndroidAnimation = false;
     }

BootAnimation::threadLoop()

1
2
3
4
5
if (mAndroidAnimation) {
  r = Android(); / / 执行android字体闪动的图片
  } else {
  r = movie(); / / 执行bootanimation. zip 中提供的动画图片
  }
1
  

==> BootAnimation::Android()会加载"images/android-logo-mask.png"和"images/android-logo-shine.png"
==> BootAnimation::movie()会加载bootanimation.zip中的内容

如果运行movie的话,Android bootanimation 制作过程

android启动动画需要一个bootanimation.zip, bootanimation.zip 放在 /system/media 目录下。
bootanimation 格式:
bootanimation.zip 里面包含part1 part2文件夹 和 desc.txt

user1@user1-desktop:~/Downloads/boot/bootanimation$ tree
.
|-- desc.txt
|-- part0
|   |-- tianyi_00000.png
|   |-- tianyi_00001.png
|   |-- tianyi_00002.png
|   |-- tianyi_00003.png
|   |-- tianyi_00004.png
|   |-- tianyi_00005.png
|   |-- tianyi_00006.png
|   |-- tianyi_00007.png
|   |-- tianyi_00008.png
|   |-- tianyi_00009.png
|   |-- tianyi_00010.png
|   |-- tianyi_00011.png
|   |-- tianyi_00012.png
|   |-- tianyi_00013.png
|   |-- tianyi_00014.png
|   |-- tianyi_00015.png
|   |-- tianyi_00016.png
|   |-- tianyi_00017.png
|   |-- tianyi_00018.png
|   |-- tianyi_00019.png
|   |-- tianyi_00020.png
|   |-- tianyi_00021.png
|   |-- tianyi_00022.png
|   |-- tianyi_00023.png
|   |-- tianyi_00024.png
|   |-- tianyi_00025.png
|   |-- tianyi_00026.png
|   `-- tianyi_00027.png
`-- part1
     `-- tianyi_00028.png

part0, part1 文件夹里面放的是动画拆分的图片,格式为png .
desc.txt里面是播放 的设置 .

desc.txt格式 :

user1@user1-desktop:~/Downloads/boot/bootanimation$ cat desc.txt
320 480 10
p 1 0 part0
p 0 0 part1


320 480是指显示的分辨率 宽 高
10是一秒的帧数
p后面的数字是指播放次数 0为循环
后面那位数字 一般为0
part0 为文件夹名

为什么要用两个文件夹呢? 一般 :
part1是播放一遍的
part2是循环播放直到开机

打包:
打包的时候一定不要压缩文件(压缩比为0)。

如果是在 linux下面,用下面的命令:
cd directory/that/contains/desc.txt/and/part0/part1/
zip -r -X -Z store ../bootanimation part*/*.png desc.txt

如果不运行动画的情况:

我们下载的源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面

所以如果你系那个用.zip的动画那么把你做好的动画拷贝到编译好对应的目录下即可,然后执行make snod整合进img包就可以看到效果了

如果你想修改android闪动的那两张图片的话,最简单的方法是直接替换图片,如果你懂openGL的话也可以自己做酷炫的动画

那两张图片放在./frameworks/base/core/res/assets/images  目录下,一张镂空的android图,一张发光效果,动画效果就是下面那张发光的效果图不断左右移动。

我是用Photoshop直接修改的

修改完后直接替换,然后再 mmm frameworks/base  , make snod 即可

以下是我修改后的效果图:

image

 

看样子还想那么回事

接下来我们给系统添加开机声音

由于动画是在BootAnimation播放的,所以我们的声音肯定也在这个类中做,照猫画虎

首先在BootAnimation.h添加方法的声明和头文件的引用

1
2
#include <media/AudioSystem.h>
#include <media/mediaplayer.h>

image

 

添加方法 void bootMusic();

image

然后在BootAnimation.cpp中实现这个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void BootAnimation::bootMusic()
{
     int index;
     MediaPlayer * mp = new MediaPlayer();
     if (mp - >setDataSource( "/system/etc/poweron.wav" , NULL) = = NO_ERROR) {
         mp - >setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE);
         mp - >prepare();
     }
     AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, &index);
     if (index ! = 0 ) {
         mp - >seekTo( 0 );
         mp - >start();
     }
 
}

请注意这个目录setDataSource("/system/etc/poweron.wav", NULL)

其实这个目录是随便写的,你想从哪个目录读这个文件就从哪个目录读好了,但是你要把这个文件放在对应的目录下

比如,这个目录是system/etc (这个目录是android系统的目录,不是源码的目录),这个文件夹是只有读权限而没有写权限的,所有你不用试adb shell了,没用的

其实system/etc这个目录对应的是我们编译后out文件夹下的xxx,然后在system/etc,所以你把poweron.wav放到这里就行了,当然如果你这时再emulaor 也同样是看不到效果的,因为你修改完还没有编译,和上面修改图片一样,make snod一下

image

然后和图上一样,你就会生成新的system.img,当然你之前添加的poweron.wav也会自动被编译进去了

image

 

然后再修改bootanimation_main.cpp这个文件,因为方法也申明了,也实现了,就是还没有调用,所以调用就在这里调

 

1
2
3
/ / play boot music - yp
         BootAnimation * animation = new BootAnimation();
         animation - >bootMusic();

 

image

修改完这写以后还需要修改Android.mk文件

因为播放声音还需要引入库

LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libbinder \
    libui \
     libskia \
    libEGL \
    libGLESv1_CM \
    libgui \
    libmedia

 

请注意,libmedia是新添加的;

完事后就ok了,当然还是需要编译的

mmm  frameworks/base/cmds/bootanimation/

make snod

 

大功告成,这样你就成功的添加了开机音乐

也许有人会问,那android系统自带的那些音乐和铃声在什么地方呢?

源码目录在framworks/base/data/sounds

至于编译完成后放到什么地方了那是Android.mk文件上配置的

不过这里叫AllAudio.mk

image

我们可以看到他又包含了很多mk文件,在同一目录下就可以找到,上图中就可以,我们随便打开一个看看

image

 

这下你们顿时明白了吧,这些资源编译后都去了神马地方

 

所以,在刚才添加poweron.wav的时候,其实可以直接把声音资源丢到framworks/base/data/sounds这个目录下

然后再mk文件中这样修改:

$(LOCAL_PATH)/poweron.wav:system/etc/poweron.wav \

 

不用我说,当然是执行mmm还有make snod命令了

 

其实还有一种办法,如果你不想这么麻烦,你可以之际把poweron.wav 文件丢到./frameworks/base/core/res/assets/sounds下,用的时候怎么用呢?

加载的时候路径是什么呢?我们看看源码

我们可以看到之前我们修改的那两张图片是怎么被加载进来的

image

而这个方法的两个参数是:

image

是不是顿时又明白了?

原来精髓所在是有个Asset可以使用,这个和上层开发中是一样的,这个文件夹中的东西是不编译的。

1
2
3
4
5
6
7
8
Asset * asset = assets. open (name, Asset::ACCESS_BUFFER);
     if (!asset)
         return NO_INIT;
     SkBitmap bitmap;
     SkImageDecoder::DecodeMemory(asset - >getBuffer(false), asset - >getLength(),
             &bitmap, SkBitmap::kNo_Config, SkImageDecoder::kDecodePixels_Mode);
     asset - >close();
     delete asset;

 

所以按照这个方法就可以找到poweron.wav 这个文件了,然后修改下bootMusic的代码就可以了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值