修改linux/Android啟動logo/開機畫面

smart_qiang發表於2013-09-12
轉載請註明出處:http://blog.csdn.net/drivelinux/article/details/8593788


一、修改uboot顯示開機logo


此處有兩種情況,一種情況是通過uboot提供的logo顯示功能顯示開機logo,另一種情況是通過定製顯示函式來進行logo的顯示。
對於第一種情況,只需要在tools/logos目錄下新增自己的logo圖片xxx_logo.bmp(需要為bmp格式並且位深度為8),並修改tools目錄下的makefile檔案即可。在makefile檔案中的相應位置加入如下程式碼:

ifeq ($(VENDOR),xxx)
LOGO_BMP= logos/xxx_logo.bmp
endif


對於第二種情況,一般需要自己將bmp檔案儲存到陣列中,並在程式中將陣列中的圖片資料寫入到lcd緩衝區進行logo的顯示。
此時,按如下步驟進行操作:
1.製作一張logo,並儲存為uboot_logo.bmp檔案;
2.在linux作業系統中,執行命令:gzip -9 uboot_logo.bmp,對圖片進行壓縮並生成uboot_logo.bmp.gz檔案;
3.執行xxd -i uboot_logo.bmp.gz > uboot_logo.h,壓縮後的圖片資料轉化為陣列並儲存成.h檔案;
4.利用uboot_logo.h檔案裡的陣列進行logo的顯示即可。
此處,需要將圖片進行gzip壓縮,否則可能會出現“Bad gzipped data uboot”的錯誤提示,並且無法顯示logo。

二、修改由kernel顯示的開機logo

1、安裝pngtopnm

sudo apt-get install netpbm 
安裝完以後就會生成pngtopnm、pnmquant、pnmtoplainpnm三個工具。

2、製作logo圖片

將logo圖片儲存為mylogo.png,注意副檔名為png。

3、製作.ppm格式的圖片

pngtopnm mylogo.png > mylogo.pnm 
pnmquant 224 mylogo.pnm > mylogo224.pnm 
pnmtoplainpnm mylogo224.pnm > logo_linux_clut224.ppm

4.拷貝檔案到相應目錄

用logo_linux_clut224.ppm替換kernel/drivers/video/logo目錄下的同名檔案,刪除對應的.o檔案並重新編譯核心即可。

5.核心的配置

核心中除了要選中 Graphics support項下的 Bootup logo配置項外,還要選中 Console display driver support配置項。否則kernel不會顯示logo。


三、修改由Android系統顯示的靜態開機畫面

1. 製作要顯示的圖片

使用PS製作一張和當前lcd解析度相同的圖片,儲存時選“儲存為 Web 所用格式”,然後在彈開的視窗上,“預設”項選擇“PNG-24”,儲存為android_logo.png。

2. 將圖片轉換為raw格式

使用linux下的ImageMagick自帶的convert命令,進行raw格式轉換,命令為:
convert -depth 8 android_logo.png rgb:android_logo.raw
如果當前系統沒有安裝該工具,可以執行下面的命令安裝:
sudo apt-get install imagemagick

3. 將raw格式轉化為rle檔案

 需要用到android編譯後的rgb2565工具,該工具在android/out/host/linux-x86/bin目錄下(android為當前原始碼所在目錄),轉換命令如下:
 rgb2565 -rle < android_logo.raw > initlogo.rle
至此,需要顯示的影象已經做好了,即initlogo.rle。

4.將initlogo.rle拷貝到檔案系統中

將initlogo.rle拷貝到out\target\product\pantherboard\root下,並替換同名檔案。然後重新制作檔案系統映像並燒寫即可。

5.特別說明

該圖片是在system/core/init/init.c檔案中顯示的,具體函式呼叫過程如下:
console_init_action();
-> load_565rle_image(INIT_IMAGE_FILE) ;
-> unlink(fn);
函式中的巨集在對應的標頭檔案android/system/core/init/init.h中定義:
 #define INIT_IMAGE_FILE "/initlogo.rle" 
對於可讀寫型的檔案系統而言,當第一次開機並顯示logo後,上述unlink(fn)函式會將該logo刪除,第二次開機時就不能再顯示這一logo了。解決辦法有兩個,一是註釋掉unlink(fn)函式,但是儘量不要修改原始碼。二是在out\target\product\xxxx\root目錄下,拷貝initlogo.rle的副本,並命名為initlogo.rle.bak,直接用initlogo.rle.bak檔案替換initlogo.rle也可以,不過原因還不清楚。

四、修改由Android顯示的“android”文字開機動畫


用winRAR 開啟android\out\target\product\xxxx\system\framework目錄下的framework-res.apk檔案,用預顯示的圖片替換assets\images下相應的圖片即可。
按上述方法能夠改變開機logo,但是由於修改的是out目錄下生成的檔案,改動對android原始碼並沒有影響,因此,若清除編譯的目標檔案並重新編譯時,修改過的logo又被原始碼中的固有logo覆蓋了。所以要修改原始碼中與logo有關的部分。具體做法是,修改/frameworks/base/core/res/assets/images/目錄下的png圖片,修改後再重新編譯就依然是我們修改後的logo了。
與這一logo顯示相關的原始碼在/frameworks/base/cmds/bootanimation/bootanimation.cp檔案中,具體函式為
bool BootAnimation::android()。

相關文章