MF99 coding 💻

keep learning; keep coding;

Android 的開機動畫

Android 在開機的時候,其實有兩種畫面,一個是剛開機的時候的靜態畫面,另外一個是開機動畫。 基本上開機的靜態畫面是存在於 bootloader 中,所以這部份一般的使用者,甚至是開發者都不太能去動。 但是在開機動畫的部份倒是保留了讓系統商甚至使用者客製化的部份。

首先,開機動畫的程式位於 frameworks/base/cmds/bootanimation/ 裡面指包含了簡單的4個檔案:

  1. Android.mk : Androidmakefile
  2. bootanimation_main.cpp : 程式進入點
  3. BootAnimation.h : header 檔
  4. BootAnimation.cpp : 主程式 基本上 BootAnimation.cpp 就是一個 Thread,然後再 Android 系統初始話的時候,由系統把 bootanimation_main 叫起然後把這個 Thread 給 run 起來。

先來看主程式中執行動畫的部份(BootAnimation.cpp):

bool BootAnimation::threadLoop()
{
    bool r;
    if (mAndroidAnimation) {
        r = android();
    } else {
        r = movie();
    }
    ...

這裡會去檢查 mAndroidAnimation 這個 flag,看看是要播放預設的 Android 動畫,就去執行 android() (也就是灰色的 Android 字樣、如下圖)

f:id:mouseface99:20191121130047j:plain

如果是要播放系統商/使用者自定的開機動畫,就執行 movie()

至於至這個 mAndroidAnimation 是什麼時候被設定的,就要看到 Thread 開始前的前置作業

status_t BootAnimation::readyToRun() {
    ...
    mAndroidAnimation = true;
    ...
    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;
    }
}

這邊的流程,基本上會去檢查三個位置 如果目前 device 是屬於加密狀態,則去檢查 SYSTEM_ENCRYPTED_BOOTANIMATION_FILE 這個開機動畫檔案是否存在 如果存在的話就使用 mZip 來開啟 如果是加密狀態或是加密的開機動畫檔案找不到的話,下一步就是檢查使用有使用者自定的開機動畫檔 USER_BOOTANIMATION_FILE, 一樣存在的話就用 mZip 開啟。 如果沒有使用者自定動畫,最後則是檢查使否有系統開發商自定的開機動畫檔 SYSTEM_BOOTANIMATION_FILE

這三個檔案的位置,定義在 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"

如果這三個檔案其中一個存在的話,就會將 mAndroidAnimation = false 告訴 Android 說請播放自定的開機動畫 否則就會維持 mAndroidAnimation = true 然後播放預設的灰色 Android 字樣動畫。

從這邊可以看出,由於 system partition 是 read-only 並且只有系統開發商才能存取,所以很明顯這塊是留給系統開發商進行客製化的時候使用,而 data partition 則是一般 user 也能夠存取的,所以如果使用者想要自行修改,就只要放在 /data/local/bootanimation.zip 就可以! (從上面的 source code 也可以看出,使用者自定的動畫是優先於系統開發商!)

至於開機動畫檔案 bootanimation.zip 的製作方法,網路上已經有很多不錯的教學,這邊就不再詳述。 唯一一點要注意一下的是! 圖片都製作好,參數檔 desc.txt 也都寫好準備打包的時候,雖然他使用的是 zip 檔,但是要注意

壓縮率一定要是0! 也就是僅有儲存,沒有壓縮!

不然在讀取的時候會讀不到! 在 Windows 上使用 WinZip 或是 WinRAR 的參考下圖 (借用一下 noob.tw 的文章 如何製作 Android 開機動畫 的圖)

f:id:mouseface99:20191121130121p:plain

或是在 Linux 底下請使用下面的指令來做打包 zip -r -X -Z store ../bootanimation part*/*.png desc.txt