天天看點

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的代碼就可以了。

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

  作者:歐陽鵬  歡迎轉載,與人分享是進步的源泉!

繼續閱讀