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

  首先看一下定義的常量:

#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判斷語句

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()

if (mAndroidAnimation) { 
r 
= Android(); // 執行android字體閃動的圖片 
} 
else { 
r 
= movie(); // 執行bootanimation.zip中提供的動畫圖片 
}

  ==> 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 即可

  以下是我修改後的效果圖:

  image

  看樣子還想那麼回事

  接下來我們給系統添加開機聲音

  由於動畫是在BootAnimation播放的,所以我們的聲音肯定也在這個類中做,照貓畫虎

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

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

  image

  添加方法 void bootMusic();

  image

  然後在BootAnimation.cpp中實現這個方法:

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這個文件,因爲方法也申明瞭,也實現了,就是還沒有調用,所以調用就在這裏調

//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可以使用,這個和上層開發中是一樣的,這個文件夾中的東西是不編譯的。

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章