Android系统移植与调试之------->如何修改Android启动动画和开机声音

附:本文转载于  http://www.cnblogs.com/jqyp/archive/2012/03/07/2383973.html

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中的内容

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

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

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

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

我是用Photoshop直接修改的

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

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

 

看样子还想那么回事

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

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

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

?


1

2

#include
<media/AudioSystem.h>

#include
<media/mediaplayer.h>

 

添加方法 void bootMusic();

然后在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一下

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

 

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

 

?


1

2

3

//play
boot music
-yp

        BootAnimation*animation= new
BootAnimation();

        animation->bootMusic();

 

修改完这写以后还需要修改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

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

 

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

 

所以,在刚才添加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下,用的时候怎么用呢?

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

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

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

是不是顿时又明白了?

原来精髓所在是有个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的代码就可以了。

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================

时间: 2013-03-25
Tags: android, 源码, wav

Android系统移植与调试之-------&gt;如何修改Android启动动画和开机声音的相关文章

Android系统移植与调试之-------&amp;gt;如何修改Android设备添加重启、飞行模式、静音模式等功能(一)

1.首先先来看一下修改前后的效果对比图 修改之后的图片 确认重启界面  具体的修改内容在下一篇中具体介绍. Android系统移植与调试之------->如何修改Android设备添加重启.飞行模式.静音模式等功能(二) ==================================================================================================   作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!   转载请保留原文地址:h

Android系统移植与调试之-------&amp;gt;如何修改Android手机显示的4G信号强度的格子数

           在修改显示的信号强度之前,先了解一下什么是dB,什么是dBm? 1.dB dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时, 按下面的计算公式:10log(甲功率/乙功率),如果采用两者的电压比计算,要用20log(甲电压/乙电压).) [例] 甲功率比乙功率大一倍,那么10lg(甲功率/乙功率)=10lg2=3dB.也就是说,甲的功率比乙的功率大3 dB. 反之,如果甲的功率是乙的功率的一半,则甲的功

Android系统移植与调试之-------&amp;gt;如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏

这两天由于一个客户的要求,将MID竖屏时候的状态条上的音量键去掉.所以尝试修改了一下,成功了,分享一下经验. 先看一下修改后的效果图,如下所示 . 横屏的时候:有音量加减键 竖屏的时候:音量加减键被去掉了  然后来说一说我的解决思路. 首先我查看了\mx0831-0525\frameworks\base\packages\SystemUI\res\layout\system_bar.xml文件 <?xml version="1.0" encoding="utf-8&qu

Android系统移植与调试之-------&amp;gt;如何修改Android手机NFC模块,使黑屏时候能够使用NFC

         我们都知道在不修改源代码的情况下,只能是解锁之后才能使用NFC功能.而在锁屏和黑屏2个状态下是没办法用NFC的,但是最近有个客户要求手机在黑屏状态下能够使用NFC,因此我们需要去修改Android源代码关于NFC模块.        最开始可以通过查看分析源代码,找到到NfcService的相关代码,如下: packages\apps\Nfc\src\com\android\nfc\NfcService.java  找到186行,这句是定义NFC能够使用的屏幕最小状态 // m

Android系统移植与调试之-------&amp;gt;如何修改Android设备存储盘符名称与Android设备的型号

 一.修改Android设备存储盘符名称 (注:TBDG1073为我的项目名称) 1.修改device/other/TBDG1073/system.prop 文件  2.修改ro.media.patition.label属性为OuyangPeng  3.修改完后重新编译  4.将MID通过USB连接到电脑  显示盘符为OuyangPeng 二.修改Android设备的型号   1.进入到~/mx0831-0525/device/other/TBDG1073目录  2.找到TBDG1073.mk文

Android系统移植与调试之-------&amp;gt;如何修改Android自带的apk出现一圈圈类似鸡蛋的花纹

最近被一个问题烦恼到了,就是android4.1系统自带的Email.文件管理器.信息等apk都出现同一个问题,就是现实在平板上的时候会出现一圈圈类似鸡蛋的花纹. 我想了两种方法来解决,第一种方法没有解决,第二种方法解决了问题. 现在我来说说我第一种方法:我尝试去直接修改相关apk的res/drawable目录下的相应图片,因为源码中的图片都不是纯白色的,所以我自己做了图片替换进去.然后重新编译,但是没有其效果. 我的第二种方法起了作用,现在就来看看第二种方法的解决步骤,拿修改Email apk

Android系统移植与调试之-------&amp;gt;如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关

              今天有个用户对[设置]有个特殊的要求,即: 1.开机的时候默认显示[开发者选项]并打开[USB调试]开关    ([Developer options]-->[USB debugging]) 2.开机的时候默认打开[安全]-->[未知来源]的开关    ([Security]--->[Unknown sources])     1.首先解决[设置]界面默认显示[开发者选项]的问题 查看源代码:packages/apps/Settings/src/com/and

Android系统移植与调试之-------&amp;gt;如何修改Android默认字体大小和设置里面字体大小比例

           因为我修改 ro.sf.lcd_density的值,将它从160修改 为120,所以导致整个系统的字体都变得很小.因此需要将整个字体变大,并且在设置-->显示-->字体大小的4个选项的值都必须变大.我想到的思路是将字体的缩放比例调大一些,下面是我的修改步骤. 1.修改默认字体的大小 Step1: 修改frameworks/base/core/java/android/content/res/Configuration.java   文件中的setToDefaults()方

Android系统移植与调试之-------&amp;gt;如何修改Android设备的默认休眠时间

1.找到~/mx0831-0525/frameworks/base/packages/SettingsProvider/res/values/ defaults.xml文件 2.修改默认休眠时间 3.重新编译 4.上述方法编译之后发现没有其效果,原来被device/other/TBDG1073/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml文件中的值所覆盖了,如果device下面有相应的文件会优先