Android 開機動畫啓動過程詳解

Android 開機會出現3個畫面:
1. Linux 系統啓動,出現Linux小企鵝畫面(reboot)(Android 1.5及以上版本已經取消加載圖片);
2. Android平臺啓動初始化,出現"A N D R I O D"文字字樣畫面;
3. Android平臺圖形系統啓動,出現含閃動的ANDROID字樣的動畫圖片(start)。

一、開機圖片(Linux小企鵝) (Android 1.5及以上版本已經取消加載圖片);
Linux Kernel引導啓動後,加載該圖片。
logo.c中定義nologo,在fb_find_logo(int depth)函數中根據nologo的值判斷是否須要加載相應圖片。
代碼以下:
static int nologo;
module_param(nologo, bool, 0);
MODULE_PARM_DESC(nologo, "Disables startup logo");
/* logo's are marked __initdata. Use __init_refok to tell
* modpost that it is intended that this function uses data
* marked __initdata.
*/
const struct linux_logo * __init_refok fb_find_logo(int depth)
{
const struct linux_logo *logo = NULL;
if (nologo)
return NULL;
        ......
}
相關代碼:
/kernel/drivers/video/fbmem.c
/kernel/drivers/video/logo/logo.c
/kernel/drivers/video/logo/Kconfig
/kernel/include/linux/linux_logo.h

二、開機文字("A N D R I O D")
Android 系統啓動後,init.c中main()調用load_565rle_image()函數讀取/initlogo.rle(一張565 rle壓縮的位圖),若是讀取成功,則在/dev/graphics/fb0顯示Logo圖片;若是讀取失敗,則將/dev/tty0設爲TEXT模式, 並打開/dev/tty0,輸出文本「A N D R I O D」字樣。
定義加載圖片文件名稱
#define INIT_IMAGE_FILE "/initlogo.rle"
int load_565rle_image( char *file_name );
#endif
init.c中main()加載/initlogo.rle文件。

if( load_565rle_image(INIT_IMAGE_FILE) ) {//加載initlogo.rle文件
    fd = open("/dev/tty0", O_WRONLY);//將/dev/tty0設爲text模式
    if (fd >= 0) {
        const char *msg;
            msg = "\n"
        "\n"
        "\n"
        "\n"
        "\n"
        "\n"
        "\n"  // console is 40 cols x 30 lines
        "\n"
        "\n"
        "\n"
        "\n"
        "\n"
        "\n"
        "\n"
        "             A N D R O I D ";
        write(fd, msg, strlen(msg));
        close(fd);
    }
}
相關代碼:
/system/core/init/init.c
   
/system/core/init/init.h
/system/core/init/init.rc
/system/core/init/logo.c
*.rle文件的製做步驟:
a. 使用GIMP或者Advanced Batch Converter軟件,將圖象轉換爲RAW格式;
b. 使用android自帶的rgb2565工具,將RAW格式文件轉換爲RLE格式(如:rgb2565 -rle < initlogo.raw > initlogo.rle)。


三、開機動畫(閃動的ANDROID字樣的動畫圖片)
Android 1.5版本:Android的系統登陸動畫相似於Windows系統的滾動條,是由前景和背景兩張PNG圖片組成,這兩張圖片存在於手機或模擬器 /system/framework /framework-res.apk文件當中,對應原文件位於/frameworks/base/core/res/assets/images/。前 景圖片(android-logo-mask.png)上的Android文字部分鏤空,背景圖片(android-logo-shine.png)則是 簡單的紋理。系統登陸時,前景圖片在最上層顯示,程序代碼(BootAnimation.android())控制背景圖片連續滾動,透過前景圖片文字鏤 空部分滾動顯示背景紋理,從而實現動畫效果。
相關代碼:
/frameworks/base/libs/surfaceflinger/BootAnimation.h
/frameworks/base/libs/surfaceflinger/BootAnimation.cpp
/frameworks/base/core/res/assets/images/android-logo-mask.png  Android默認的前景圖片,文字部分鏤空,大小256×64
/frameworks/base/core/res/assets/images/android-logo-shine.png Android默認的背景圖片,有動感效果,大小512×64

Android 1.6及以上版本:
init.c解析init.rc(其中定義服務:「service bootanim /system/bin/bootanimation」),bootanim 服務由SurfaceFlinger.readyToRun()(property_set("ctl.start", "bootanim");)執行開機動畫、bootFinished()(property_set("ctl.stop", "bootanim");)執行中止開機動畫。
BootAnimation.h和BootAnimation.cpp文件放到了/frameworks/base/cmds /bootanimation目錄下了,增長了一個入口文件bootanimation_main.cpp。Android.mk文件中能夠看到,將開機 動畫從原來的SurfaceFlinger裏提取出來了,生成可執行文件:bootanimation。Android.mk代碼以下:
//=============Android.mk======================
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
    bootanimation_main.cpp \
    BootAnimation.cpp
# need "-lrt" on Linux simulator to pick up clock_gettime
ifeq ($(TARGET_SIMULATOR),true)
    ifeq ($(HOST_OS),linux)
        LOCAL_LDLIBS += -lrt
    endif
endif
LOCAL_SHARED_LIBRARIES := \
    libcutils \
    libutils \
    libui \
    libcorecg \
    libsgl \
    libEGL \
    libGLESv1_CM \
    libmedia   
LOCAL_C_INCLUDES := \
    $(call include-path-for, corecg graphics)
LOCAL_MODULE:= bootanimation
include $(BUILD_EXECUTABLE)
//==========================================
(1)adb shell後,能夠直接運行「bootanimation」來從新看開機動畫,它會一直處於動畫狀態,而不會中止。
(2)adb shell後,命令「setprop ctl.start bootanim」執行開機動畫;命令「getprop ctl.start bootanim」中止開機動畫。這兩句命令分別對應SurfaceFlinger.cpp的兩句語 句:property_set("ctl.start", "bootanim");和property_set("ctl.stop", "bootanim");
相關文件:
/frameworks/base/cmds/bootanimation/BootAnimation.h
/frameworks/base/cmds/bootanimation/BootAnimation.cpp
/frameworks/base/cmds/bootanimation/bootanimation_main.cpp
/system/core/init/init.c
/system/core/rootdir/init.rc
參考文檔:
圖說Android開機畫面和開機動畫
http://www.shudoo.com/09/1030/15/13418431.html
initlogo.rle: display an image on boot
http://forum.xda-developers.com/showthread.php?t=443431
php

相關文章
相關標籤/搜索