android4.0.3 修改启动动画和开机声音
1. Linux 系統(tǒng)啟動(dòng),出現(xiàn)Linux小企鵝畫(huà)面(reboot)(Android 1.5及以上版本已經(jīng)取消加載圖片);
2. Android平臺(tái)啟動(dòng)初始化,出現(xiàn)"A N D R I O D"文字字樣畫(huà)面;
3. Android平臺(tái)圖形系統(tǒng)啟動(dòng),出現(xiàn)含閃動(dòng)的ANDROID字樣的動(dòng)畫(huà)圖片(start)。
現(xiàn)在我們說(shuō)的是第三種方式(基于模擬器):
android開(kāi)機(jī)動(dòng)畫(huà)叫源碼位于frameworks/base/cmds/bootanimation下,這個(gè)程序會(huì)將/data/local/bootanimation.zip或/system/media/bootanimation.zip里面的png圖片以動(dòng)畫(huà)的形式播放出來(lái)。
首先,我們先來(lái)分析一下源碼:
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()
進(jìn)入一個(gè)if判斷語(yǔ)句
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(); // 執(zhí)行android字體閃動(dòng)的圖片} else {r = movie(); // 執(zhí)行bootanimation.zip中提供的動(dòng)畫(huà)圖片} ?==> BootAnimation::Android()會(huì)加載"images/android-logo-mask.png"和"images/android-logo-shine.png"
==> BootAnimation::movie()會(huì)加載bootanimation.zip中的內(nèi)容
我們下載的源碼里默認(rèn)是沒(méi)有那些個(gè).zip動(dòng)畫(huà)的,所以總會(huì)跳到android字體閃動(dòng)的畫(huà)面
所以如果你系那個(gè)用.zip的動(dòng)畫(huà)那么把你做好的動(dòng)畫(huà)拷貝到編譯好對(duì)應(yīng)的目錄下即可,然后執(zhí)行make snod整合進(jìn)img包就可以看到效果了
如果你想修改android閃動(dòng)的那兩張圖片的話,最簡(jiǎn)單的方法是直接替換圖片,如果你懂openGL的話也可以自己做酷炫的動(dòng)畫(huà)
那兩張圖片放在./frameworks/base/core/res/assets/images? 目錄下,一張鏤空的android圖,一張發(fā)光效果,動(dòng)畫(huà)效果就是下面那張發(fā)光的效果圖不斷左右移動(dòng)。
我是用Photoshop直接修改的
修改完后直接替換,然后再 mmm frameworks/base? , make snod 即可
以下是我修改后的效果圖:
?
看樣子還想那么回事
接下來(lái)我們給系統(tǒng)添加開(kāi)機(jī)聲音
由于動(dòng)畫(huà)是在BootAnimation播放的,所以我們的聲音肯定也在這個(gè)類中做,照貓畫(huà)虎
首先在BootAnimation.h添加方法的聲明和頭文件的引用
#include <media/AudioSystem.h> #include <media/mediaplayer.h>?
添加方法 void bootMusic();
然后在BootAnimation.cpp中實(shí)現(xiàn)這個(gè)方法:
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();}}請(qǐng)注意這個(gè)目錄setDataSource("/system/etc/poweron.wav", NULL)
其實(shí)這個(gè)目錄是隨便寫的,你想從哪個(gè)目錄讀這個(gè)文件就從哪個(gè)目錄讀好了,但是你要把這個(gè)文件放在對(duì)應(yīng)的目錄下
比如,這個(gè)目錄是system/etc (這個(gè)目錄是android系統(tǒng)的目錄,不是源碼的目錄),這個(gè)文件夾是只有讀權(quán)限而沒(méi)有寫權(quán)限的,所有你不用試adb shell了,沒(méi)用的
其實(shí)system/etc這個(gè)目錄對(duì)應(yīng)的是我們編譯后out文件夾下的xxx,然后在system/etc,所以你把poweron.wav放到這里就行了,當(dāng)然如果你這時(shí)再emulaor 也同樣是看不到效果的,因?yàn)槟阈薷耐赀€沒(méi)有編譯,和上面修改圖片一樣,make snod一下
然后和圖上一樣,你就會(huì)生成新的system.img,當(dāng)然你之前添加的poweron.wav也會(huì)自動(dòng)被編譯進(jìn)去了
?
然后再修改bootanimation_main.cpp這個(gè)文件,因?yàn)榉椒ㄒ采昝髁?#xff0c;也實(shí)現(xiàn)了,就是還沒(méi)有調(diào)用,所以調(diào)用就在這里調(diào)
?
//play boot music -ypBootAnimation *animation = new BootAnimation();animation->bootMusic();?
修改完這寫以后還需要修改Android.mk文件
因?yàn)椴シ怕曇暨€需要引入庫(kù)
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libbinder \
??? libui \
???? libskia \
??? libEGL \
??? libGLESv1_CM \
??? libgui \
??? libmedia
?
請(qǐng)注意,libmedia是新添加的;
完事后就ok了,當(dāng)然還是需要編譯的
mmm? frameworks/base/cmds/bootanimation/
make snod
?
大功告成,這樣你就成功的添加了開(kāi)機(jī)音樂(lè)
也許有人會(huì)問(wèn),那android系統(tǒng)自帶的那些音樂(lè)和鈴聲在什么地方呢?
源碼目錄在framworks/base/data/sounds
至于編譯完成后放到什么地方了那是Android.mk文件上配置的
不過(guò)這里叫AllAudio.mk
我們可以看到他又包含了很多mk文件,在同一目錄下就可以找到,上圖中就可以,我們隨便打開(kāi)一個(gè)看看
?
這下你們頓時(shí)明白了吧,這些資源編譯后都去了神馬地方
?
所以,在剛才添加poweron.wav的時(shí)候,其實(shí)可以直接把聲音資源丟到framworks/base/data/sounds這個(gè)目錄下
然后再mk文件中這樣修改:
$(LOCAL_PATH)/poweron.wav:system/etc/poweron.wav \
?
不用我說(shuō),當(dāng)然是執(zhí)行mmm還有make snod命令了
?
其實(shí)還有一種辦法,如果你不想這么麻煩,你可以之際把poweron.wav 文件丟到./frameworks/base/core/res/assets/sounds下,用的時(shí)候怎么用呢?
加載的時(shí)候路徑是什么呢?我們看看源碼
我們可以看到之前我們修改的那兩張圖片是怎么被加載進(jìn)來(lái)的
而這個(gè)方法的兩個(gè)參數(shù)是:
是不是頓時(shí)又明白了?
原來(lái)精髓所在是有個(gè)Asset可以使用,這個(gè)和上層開(kāi)發(fā)中是一樣的,這個(gè)文件夾中的東西是不編譯的。
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;?
所以按照這個(gè)方法就可以找到poweron.wav 這個(gè)文件了,然后修改下bootMusic的代碼就可以了。
轉(zhuǎn)載于:https://www.cnblogs.com/jqyp/archive/2012/03/07/2383973.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的android4.0.3 修改启动动画和开机声音的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简析EDMX文件的构成 - CSDL、S
- 下一篇: java jvm容器_java –