Android开机logo修改方法
?
一體機平臺開機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修改方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何修改Android应用程序能够使用的
- 下一篇: 输入设备配置文件(.idc文件)