Android: 起動画面のカスタマイズ(4) - bootanimation -

前回の記事で載せた立ち上げ途中の画面のカスタマイズの具体的な手順は次のようになります。

起動時の画面表示のシーケンスとしては、/initlogo.rleファイルがある場合はカーネルが生成したinitプロセスが/initlogo.rleファイルのイメージを画面に表示します。(前々回はここをカスタマイズ。また、実機によってはブートローダが画面表示を行う場合もあるかも知れませんが、今回は省略。)

次に/init.rcの中の記述行 "service bootanim /system/bin/bootanimation"によってbootanimationコマンドが起動されます。
bootanimationコマンドはアセット中のPNGファイル(images/android-logo-mask.png, images/android-logo-shine.png)を読み取って、アニメーションを表示します。
なお、/data/local/bootanimation.zip あるいは /system/media/bootanimation.zip にファイルがあればこちらを読み取って、アニメーションを表示します。
よって、bootanimation.zipファイルを作成し、/data/localディレクトリに置けばカスタマイズができます。

1. bootanimation.zipファイルを作成する

 以下、AVDのSkinがHVGA(320x480)で、PNGファイルを3つ使用する例です。

$ mkdir liquors
GIMPで320x480のPNGファイルを3枚作成し、liquorsディレクトリの下にコピーしました。
PNGファイルはドット(.)の左側の番号順に表示されます。

1.png 2.png 3.png

$ vi desc.txt

$ cat desc.txt
320 480 1   ← 幅 高さ fps(Frame Per Second: 1秒当たりのフレーム数、フレームレート)
p 0 0 liquors  ← p ループの回数(0は無限ループ) pauseの時間 PNGファイルの置かれているディレクトリ名
 (pで始まる行は複数行を書くことができる。複数の場合は上から下に順に実行される。)

$ zip -Z store -r bootanimation.zip desc.txt liquors
adding: desc.txt (stored 0%)
adding: liquors/ (stored 0%)
adding: liquors/1.png (stored 0%)
adding: liquors/2.png (stored 0%)
adding: liquors/3.png (stored 0%)

上記手順で作成したbootanimation.zipを参考に こちら に置いておきます。

参考:
desc.txtファイルの記述を説明したページ
http://www.droidforums.net/forum/droid-hacks/33932-bootanimation-zip-fil...
色々なブートアニメーションファイルが置かれているサイト
http://androidforums.com/htc-droid-eris/56647-boot-animation-gallery.htm...

2. bootanimation.zipをエミュレータの/data/localディレクトリの下にコピーする

< SDKのルートディレクトリ >/platform-tools ディレクトリの下で次のコマンドを実行する。
$ ./adb -e push bootanimation.zip /data/local
1719 KB/s (35566 bytes in 0.020s)

3. エミュレータを再起動する

init => init.rc => bootanimation => bootanimation.zip のシーケンスでカスタマイズされたアニメーションが表示される。

[参考]

bootanimationコマンドのソースは以下にあります。
$ ls < Androidソースのルートディレクトリ >/frameworks/base/cmds/bootanimation
Android.mk BootAnimation.cpp BootAnimation.h bootanimation_main.cpp

android-logo-mask.png, android-logo-shine.pngは以下にあります。
$ ls < Androidソースのルートディレクトリ >/frameworks/base/core/res/assets/images
android-logo-mask.png android-logo-shine.png



BootAnimation.cpp

52 #define USER_BOOTANIMATION_FILE "/data/local/bootanimation.zip" 53 #define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip" ........................... 250 mAndroidAnimation = true; 251 if ((access(USER_BOOTANIMATION_FILE, R_OK) == 0) && 252 (mZip.open(USER_BOOTANIMATION_FILE) == NO_ERROR) || 253 (access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) && 254 (mZip.open(SYSTEM_BOOTANIMATION_FILE) == NO_ERROR)) 255 mAndroidAnimation = false; ........................... 260 bool BootAnimation::threadLoop() 261 { 262 bool r; 263 if (mAndroidAnimation) { 264 r = android(); 265 } else { 266 r = movie(); 267 } ........................... 279 bool BootAnimation::android() 280 { 281 initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png"); 282 initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png"); ........................... 345 bool BootAnimation::movie() 346 { 347 ZipFileRO& zip(mZip); 348 349 size_t numEntries = zip.getNumEntries(); 350 ZipEntryRO desc = zip.findEntryByName("desc.txt"); 351 FileMap* descMap = zip.createEntryFileMap(desc);