天天看点

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

首先看一下定义的常量:

<a target="_blank" href="http://www.cnblogs.com/jqyp/archive/2012/03/07/2383973.html#">?</a>

1

2

3

4

<code>#define USER_BOOTANIMATION_FILE "/data/local/bootanimation.zip"</code>

<code>#define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip"</code>

<code>#define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/bootanimation-encrypted.zip"</code>

BootAnimation::readyToRun()

进入一个if判断语句

5

6

7

8

9

10

11

<code>if</code> <code>((encryptedAnimation &amp;&amp;</code>

<code>            </code><code>(access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK)</code><code>=</code><code>=</code> <code>0</code><code>) &amp;&amp;</code>

<code>            </code><code>(mZip.</code><code>open</code><code>(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE)</code><code>=</code><code>=</code> <code>NO_ERROR)) ||</code>

<code>            </code><code>((access(USER_BOOTANIMATION_FILE, R_OK)</code><code>=</code><code>=</code> <code>0</code><code>) &amp;&amp;</code>

<code>            </code><code>(mZip.</code><code>open</code><code>(USER_BOOTANIMATION_FILE)</code><code>=</code><code>=</code> <code>NO_ERROR)) ||</code>

<code>            </code><code>((access(SYSTEM_BOOTANIMATION_FILE, R_OK)</code><code>=</code><code>=</code> <code>0</code><code>) &amp;&amp;</code>

<code>            </code><code>(mZip.</code><code>open</code><code>(SYSTEM_BOOTANIMATION_FILE)</code><code>=</code><code>=</code> <code>NO_ERROR))) {</code>

<code>        </code><code>mAndroidAnimation</code><code>=</code> <code>false;</code>

<code>    </code><code>}</code>

BootAnimation::threadLoop()

<code>if</code> <code>(mAndroidAnimation) {</code>

<code> </code><code>r</code><code>=</code> <code>Android();</code><code>/</code><code>/</code> <code>执行android字体闪动的图片</code>

<code> </code><code>}</code><code>else</code> <code>{</code>

<code> </code><code>r</code><code>=</code> <code>movie();</code><code>/</code><code>/</code> <code>执行bootanimation.</code><code>zip</code><code>中提供的动画图片</code>

<code> </code><code>}</code>

<code> </code> 

==&gt; BootAnimation::Android()会加载"images/android-logo-mask.png"和"images/android-logo-shine.png"

==&gt; 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 即可

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

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

看样子还想那么回事

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

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

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

<code>#include &lt;media/AudioSystem.h&gt;</code>

<code>#include &lt;media/mediaplayer.h&gt;</code>

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

添加方法 void bootMusic();

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

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

12

13

14

15

<code>void BootAnimation::bootMusic()</code>

<code>{</code>

<code>    </code><code>int</code> <code>index;</code>

<code>    </code><code>MediaPlayer</code><code>*</code> <code>mp</code><code>=</code> <code>new MediaPlayer();</code>

<code>    </code><code>if</code> <code>(mp</code><code>-</code><code>&gt;setDataSource(</code><code>"/system/etc/poweron.wav"</code><code>, NULL)</code><code>=</code><code>=</code> <code>NO_ERROR) {</code>

<code>        </code><code>mp</code><code>-</code><code>&gt;setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE);</code>

<code>        </code><code>mp</code><code>-</code><code>&gt;prepare();</code>

<code>    </code><code>AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, &amp;index);</code>

<code>    </code><code>if</code> <code>(index !</code><code>=</code> <code>0</code><code>) {</code>

<code>        </code><code>mp</code><code>-</code><code>&gt;seekTo(</code><code>0</code><code>);</code>

<code>        </code><code>mp</code><code>-</code><code>&gt;start();</code>

<code>}</code>

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

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

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

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

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

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

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

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

<code>/</code><code>/</code><code>play boot music</code><code>-</code><code>yp</code>

<code>        </code><code>BootAnimation</code><code>*</code><code>animation</code><code>=</code> <code>new BootAnimation();</code>

<code>        </code><code>animation</code><code>-</code><code>&gt;bootMusic();</code>

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

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

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

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

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

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

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

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

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

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

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

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

是不是顿时又明白了?

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

<code>Asset</code><code>*</code> <code>asset</code><code>=</code> <code>assets.</code><code>open</code><code>(name, Asset::ACCESS_BUFFER);</code>

<code>    </code><code>if</code> <code>(!asset)</code>

<code>        </code><code>return</code> <code>NO_INIT;</code>

<code>    </code><code>SkBitmap bitmap;</code>

<code>    </code><code>SkImageDecoder::DecodeMemory(asset</code><code>-</code><code>&gt;getBuffer(false), asset</code><code>-</code><code>&gt;getLength(),</code>

<code>            </code><code>&amp;bitmap, SkBitmap::kNo_Config, SkImageDecoder::kDecodePixels_Mode);</code>

<code>    </code><code>asset</code><code>-</code><code>&gt;close();</code>

<code>    </code><code>delete asset;</code>

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

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

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

继续阅读