Android開機logo修改方法 【轉】

來源:互聯網
上載者:User

標籤:停止   ext   strdup   平台   binder   tty   pbm   sdk   phi   

本文轉載自:http://blog.csdn.net/qq258711519/article/details/7766303

一體機平台開機logo修改方法

 

1:修改Kernel中的Logo:

       若是要替換Kernel中的開機Logo,只需要把核心目錄drivers/video/logo下的logo_android_1024_clut224.ppm檔案替換掉即可(注意要保持名字一樣,在IMT的SDK裡沒有這個ppm,預設選擇了Standard 224-color Linux logo)。然後從新編譯核心,把得到的zImage燒寫到Nand Flash就可以了。其中製作logo_android_1024_clut224.ppm的方法如下:

      1>、找一張分別率為1024x600、尾碼為png的圖片。然後放到linux系統下。

       2>、製作ppm檔案,使用命令:這裡製作的是名字為linuxlogo.png的png圖片。

              # pngtopnm linuxlogo.png > linuxlogo.pnm

# pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm

# pnmtoplainpnm linuxlogo224.pnm > linuxlogo224.ppm

       製作完成之後,把linuxlogo224.ppm的名字修改為logo_android_1024_clut224.ppm,然後替換核心中相應的檔案。

       如果沒有安裝png圖片製作庫的話,在製作ppm檔案之前需要安裝如下庫檔案。

       netpbm libnetpbm10 libnetpbm10-dev

       載入方法:

   $sudo apt-get install netpbm libnetpbm10 libnetpbm10-dev

       載入完成之後就可以製作了。

核心Logo在核心配置中的位置如下:

Device Drivers  --->

       Graphics support  --->

              [*] Bootup logo  --->

 

       其中[*]   Standard 224-color Android logo(1024X600)為我們製作的開機Logo,

[ ]   Standard 224-color Linux logo是Linux內建的開機Logo小企鵝。

 

2:修改android系統的開機Logo

Android系統的開機Logo是播放一個名字為bootanimation.zip的壓縮檔,在系統中的位置為data/local/bootanimation.zip。可以在Android系統中直接替換。一般是在Android系統運行之後替換掉data/local/下的bootanimation.zip檔案比較方便。

      

       bootanimation.zip檔案是zip壓縮檔,壓縮方式要求是儲存壓縮,包含一個檔案和兩個目錄:

       1.動畫屬性描述檔案:desc.txt

    2.第一階段動畫圖片目錄:part0

    3.第二階段動畫圖片目錄:part1

 

desc.txt檔案內容:

        1024 600 30

       p 1 0 part0

        p 0 10 part1

   

desc.txt檔案分析:

        1024  600   30

        寬    高    幀數

        p         1              0         part0

        標誌符 迴圈次數 階段切換間隔時間  對應目錄名

        p         0             10         part1

        標誌符 迴圈次數 階段切換間隔時間  對應目錄名

 

    ==================

    標誌符:

        必須是: p

 

    迴圈次數:

        0 : 表示本階段無限迴圈

 

    階段切換間隔時間:

        單位是一個幀的期間,比如幀數是30,那麼幀的期間就是1秒/30 = 33.3毫秒。

        階段切換間隔時間期間開機動畫進程進入休眠,把CPU時間讓給初始化系統使用。

        也就是間隔長啟動會快,但會影響動畫效果。

 

part0和part1目錄內包含的是兩個動畫的系列圖片,圖片為PNG格式。系列圖片檔案的載入重新整理按檔案名稱的名稱排序。

 

     bootanimation.zip檔案的製作方法如下:

       1)、先製作desc.txt、part0和part1三個檔案,如下:

 

    2)、把desc.txt、part0和part1三個檔案製作為自拍格式的壓縮檔,如下:

 

    其中圖示標出的1、2和3和地方必須。在點擊確定之後就會產生一個bootanimation.zip檔案,即時Android系統播放的logo檔案。直接替換掉系統data/local/下的bootanimation.zip即可。

 

針對一體機平台,最簡單的修改方法是把part2下的bootloop_frame_0001.png檔案替換掉即可。

 

 

 

Android開機畫面原理

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

 

1、開機圖片(Linux小企鵝) (Android 1.5及以上版本已經取消載入圖片); 
Linux Kernel引導啟動後,載入該圖片。 
logo.c中定義nologo,在fb_find_logo(int depth)函數中根據nologo的值判斷是否需要載入相應圖片。(源碼:kernel\drivers\video\logo)
代碼如下: 
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
2、開機文字("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檔案。

static int console_init_action(int nargs, char **args)

{

    int fd;

    char tmp[PROP_VALUE_MAX];

 

    if (console[0]) {

        snprintf(tmp, sizeof(tmp), "/dev/%s", console);

        console_name = strdup(tmp);

    }

 

    fd = open(console_name, O_RDWR);

    if (fd >= 0)

        have_console = 1;

    close(fd);

 

    if( load_565rle_image(INIT_IMAGE_FILE) ) {

        fd = open("/dev/tty0", O_WRONLY);

        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 ";

            "             R o c k c h i p   R - B O X";

            write(fd, msg, strlen(msg));

            close(fd);

        }

    }

    return 0;

}

相關代碼:

/system/core/init/init.c
/system/core/init/init.h
/system/core/init/init.rc
/system/core/init/logo.c

/kernel/drivers/staging/msm/Logo.c

 

*.rle檔案的製作步驟:
a. 使用GIMP或者Advanced Batch Converter軟體,將圖象轉換為RAW格式;
b. 使用android內建的rgb2565工具,將RAW格式檔案轉換為RLE格式(如:rgb2565 -rle < initlogo.raw > initlogo.rle)。

說明:

在RK盒子上沒有顯示出R o c k c h i p   R - B O X字樣是因為linux核心配置的問題。
開啟核心framebuffer控制台即可。
(1)make menuconifg後選擇Device Drivers->Graphics support->Console display driver support->Framebuffer Console support
然後開啟相關的幾個配置選項即可。
3、開機動畫(閃動的ANDROID字樣的動畫圖片)

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

 

LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES

 

LOCAL_SHARED_LIBRARIES := \

       libcutils \

       libutils \

       libbinder \

    libui \

       libskia \

    libEGL \

    libGLESv1_CM \

    libgui

 

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.r

說明:

android開機動畫的源碼位於frameworks/base/cmds/bootanimation下,這個程式會將/data/local/bootanimation.zip或/system/media/bootanimation.zip裡面的png或者jpg圖片以動畫的形式播放出來。

首先,我們先來分析一下源碼:

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()

進入一個if判斷語句

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(); //執行android字型閃動的圖片

 } else{

 r =movie(); //執行bootanimation.zip中提供的動畫圖片

 }

==> BootAnimation::Android()會載入"images/android-logo-mask.png"和"images/android-logo-shine.png"
==> BootAnimation::movie()會載入bootanimation.zip中的內容

RK提供的源碼裡預設是沒有那些個.zip動畫的,所以總會跳到android字型閃動的畫面

所以如果要用.zip的動畫那麼只要把做好的動畫拷貝到編譯好對應的目錄下即可,如果想修改android閃動的那兩張圖片的話,最簡單的方法是直接替換圖片,那兩張圖片在./frameworks/base/core/res/assets/images  目錄下,一張鏤空的android圖,一張光暈效果,動畫效果就是下面那張發光的不斷左右移動。

 

/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開機logo修改方法 【轉】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.