熱門文章

11.24.2010

[ Android ] 開機畫面 (4)

bootanimation 的另一個開機動畫實現方法在 BootAnimation::movie()。
這邊是以播放圖片的方式,來呈現動畫效果。

使用這個方法的話,必須遵守它的規則。


1. 檔案 desc.txt
2. 目錄 part0/

desc.txt 是用來設定 bootanimation 如何去播放 part0/ 下的圖片,圖片必須使用PNG。
當然,你可以有 part1/, part2/, ..., partN/ 多個目錄,來存放你的動畫圖片。

bootanimation 在播放 part0/ 目錄裡面的圖檔,是依照檔案名稱的排序方式在播放,
所以檔案的命名最好是類似 xxx_001.png ~ xxx_nnn.png。

desc.txt 的內容大致上類似:

256 256 30
p 1 0 part0
p 0 0 part 1
... 

第一行是表示:
width height fps
設定圖片寬高跟每秒要播放幾張。

第二行以後的:
p count pause path
count 代表要播放 count 次,0為無限。
pause 代表每播放完一個循環後,要進入下個循環之前,中間要不要停頓一下下。
path 代表目錄名稱,part0, part1, ...。

東西準備完備後,把這些東西壓縮成一個 bootanimation.zip 檔。
zip -0r bootanimation.zip desc.txt part0/

最後把這個檔案放到 /data/local/bootanimation.zip 就好了。

11.22.2010

[ Android ] 開機畫面 (3)

之前有說過,Android 內建的 bootanimation 這隻程式可用兩種方式來呈現開機動畫。

其中一種方式是以兩張圖片來呈現掃光的效果。
你可以在 frameworks/base/core/res/assets/images 這個目錄下,找到 android-logo-mask.png 和 android-logo-shine.png 這兩個檔案。



上圖 android-logo-mask.png 有著 android 鏤空字樣,就是透明、transparent。
下圖 android-logo-shine.png 就是一張有著不同顏色的圖。

若要自己設計這兩張圖,圖檔格式必須為 PNG,而且圖的寬高建議為2的冪次方
pixels。
為什麼會建議為2的冪次方?因為在某些機器上 OpenGL ES 會有無法顯示非2冪次方大小的圖的問題。

這個功能,我們可以在 frameworks/base/cmds/bootanimation/BootAnimation.cpp 中的 BootAnimation::android() 看到。

可以看到,這個 function 會將兩張圖置中並重疊在一起,然後慢慢移動底圖,也就是 android-logo-shine.png 這張圖,最後我們看到的效果就是 android 這幾個閃閃發光的字。

改完後,記得重新編譯 framework,"mm framework"。
然後把編出來的 framework-res.apk,替換掉原本在手機內的 /system/framework/framework-res.apk,就大功告成了。

11.17.2010

[ Android ] 開機畫面 (2)

如何製作 initlogo.rle ?

1. 先準備一張與目標板上LCD解析度相符的圖,例如:480x800,格式為JPEG或PNG。

2. 確認Linux系統中有安裝imagemagick這個套件,因為需要用到'convert'這個指令來轉換圖片格式。沒有的話請用apt-get或yum安裝。

3. 假設圖片名稱為:initlogo.png。
    $convert initlogo.png rgb:intlogo.rgb

4. 在Android source code的目錄下,可以找到'rgb2565'這隻程式(out/host/linux-x86/bin/rgb2565)。
    $rgb2565 -rle < intlogo.rgb > initlogo.rle

5. 最後把 initlogo.rle 加到 ramdisk 裡面就好了。

11.13.2010

[ Android ] 開機音效 (1)

若是在Android 2.1,init.rc裡面應該有這幾行:
service bootsound /system/bin/playmp3
    user media
    group audio
    oneshot

這就是開機音效,可是你一定找不到playmp3這隻程式。
但Android裡面的確已經有現成可用的程式了,只不過它不叫playmp3,它叫sound。
source code在"android_source/system/extras/sound/"。
只要將上述的playmp3更名為sound,並將一隻WAV音訊檔複製到手機或開發板上的"/data/out.wav"即可。
Android 2.2的話,上述幾行可能要自己加。

[ Android ] 開機畫面 (1)

就我所知,Android開機畫面可分為幾個階段來實作:
1. Boot Loader
2. FrameBuffer Driver
3. init
4. bootanimation

若要開機畫面在使用者按下Power Button後的第一時間就顯示,Boot Loader必須先把畫面輸出到LCD上。

當Boot Loader帶起Linux Kernel後,FrameBuffer Driver initialize hardware時,可再輸出一張畫面。

當kernel結束後,會去執行"/init"。Android就是在這邊將"/initlogo.rle"這張圖輸出到LCD上。

在Android上,"/init"會去讀取"/init.rc"。如果仔細看看init.rc的話,應該會發現有這麼一行:service bootanim /system/bin/bootanimation。沒錯!這時候就會執行bootanimation這隻程式。

bootanimation有兩種方式來呈現開機動畫。
其一,確認系統中是否存在"/data/local/bootanimation.zip"這個檔案,以播放圖片方式來產生動畫效果。
其二,若不存在前述檔案,則使用系統中的"android-logo-mask.png"和"android-logo-shine.png"來產生文字掃光的動畫效果。這兩個檔案在"android_source/frameworks/base/core/res/assets/images/"。
當然,你可以使用這兩種方式,改改圖片來達成你想要得效果,或者自己重寫一隻更炫的bootanimation。

上述的方法,若要達到seamless的話,還會有一些技術上的細節。


開機畫面這種東西,其實是在開機時間長的機器上才有其必要,為了不要讓user一直盯著黑畫面,還以為手機壞掉。
若開機時間只要一秒,開機畫面其實是多餘的。