Android开机logo修改方法
?
一體機(jī)平臺(tái)開(kāi)機(jī)logo修改方法
?
1:修改Kernel中的Logo:
?????? 若是要替換Kernel中的開(kāi)機(jī)Logo,只需要把內(nèi)核目錄drivers/video/logo下的logo_android_1024_clut224.ppm文件替換掉即可(注意要保持名字一樣,在IMT的SDK里沒(méi)有這個(gè)ppm,默認(rèn)選擇了Standard 224-color Linux logo)。然后從新編譯核心,把得到的zImage燒寫(xiě)到Nand Flash就可以了。其中制作logo_android_1024_clut224.ppm的方法如下:
? ??? 1>、找一張分別率為1024x600、后綴為png的圖片。然后放到Linux系統(tǒng)下。
?????? 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,然后替換核心中相應(yīng)的文件。
?????? 如果沒(méi)有安裝png圖片制作庫(kù)的話,在制作ppm文件之前需要安裝如下庫(kù)文件。
?????? netpbm libnetpbm10 libnetpbm10-dev
?????? 加載方法:
?? $sudo apt-get install netpbm libnetpbm10 libnetpbm10-dev
?????? 加載完成之后就可以制作了。
核心Logo在內(nèi)核配置中的位置如下:
Device Drivers? --->
?????? Graphics support? --->
????????????? [*] Bootup logo? --->
?????? 其中[*]?? Standard 224-color Android logo(1024X600)為我們制作的開(kāi)機(jī)Logo,
[ ]?? Standard 224-color Linux logo是Linux自帶的開(kāi)機(jī)Logo小企鵝。
?
2:修改Android系統(tǒng)的開(kāi)機(jī)Logo
Android系統(tǒng)的開(kāi)機(jī)Logo是播放一個(gè)名字為bootanimation.zip的壓縮文件,在系統(tǒng)中的位置為data/local/bootanimation.zip。可以在Android系統(tǒng)中直接替換。一般是在Android系統(tǒng)運(yùn)行之后替換掉data/local/下的bootanimation.zip文件比較方便。
??????
?????? bootanimation.zip文件是zip壓縮文件,壓縮方式要求是存儲(chǔ)壓縮,包含一個(gè)文件和兩個(gè)目錄:
?????? 1.動(dòng)畫(huà)屬性描述文件:desc.txt
??? 2.第一階段動(dòng)畫(huà)圖片目錄:part0
??? 3.第二階段動(dòng)畫(huà)圖片目錄:part1
?
desc.txt文件內(nèi)容:
??? ??? 1024 600 30
?? ??? p 1 0 part0
??? ??? p 0 10 part1
???
desc.txt文件分析:
??? ??? 1024? 600?? 30
???? ?? 寬?? ?高??? 幀數(shù)
????? ? p???????? 1???? ?????????0???????? part0
??? ??? 標(biāo)志符 循環(huán)次數(shù) 階段切換間隔時(shí)間? 對(duì)應(yīng)目錄名
????? ? p???? ????0???????????? 10??????? ?part1
??? ??? 標(biāo)志符 循環(huán)次數(shù) 階段切換間隔時(shí)間? 對(duì)應(yīng)目錄名
?
??? ==================
??? 標(biāo)志符:
??????? 必須是: p
?
??? 循環(huán)次數(shù):
??????? 0 : 表示本階段無(wú)限循環(huán)
?
??? 階段切換間隔時(shí)間:
??????? 單位是一個(gè)幀的持續(xù)時(shí)間,比如幀數(shù)是30,那么幀的持續(xù)時(shí)間就是1秒/30 = 33.3毫秒。
??????? 階段切換間隔時(shí)間期間開(kāi)機(jī)動(dòng)畫(huà)進(jìn)程進(jìn)入休眠,把CPU時(shí)間讓給初始化系統(tǒng)使用。
??????? 也就是間隔長(zhǎng)啟動(dòng)會(huì)快,但會(huì)影響動(dòng)畫(huà)效果。
?
part0和part1目錄內(nèi)包含的是兩個(gè)動(dòng)畫(huà)的系列圖片,圖片為PNG格式。系列圖片文件的加載刷新按文件名的名稱排序。
?
??? ?bootanimation.zip文件的制作方法如下:
?????? 1)、先制作desc.txt、part0和part1三個(gè)文件,如下:
??? 2)、把desc.txt、part0和part1三個(gè)文件制作為自拍格式的壓縮文件,如下:
??? 其中圖示標(biāo)出的1、2和3和地方必須如圖所示。在點(diǎn)擊確定之后就會(huì)生成一個(gè)bootanimation.zip文件,即時(shí)Android系統(tǒng)播放的logo文件。直接替換掉系統(tǒng)data/local/下的bootanimation.zip即可。
?
針對(duì)一體機(jī)平臺(tái),最簡(jiǎn)單的修改方法是把part2下的bootloop_frame_0001.png文件替換掉即可。
?
?
?
Android開(kāi)機(jī)畫(huà)面原理
Android系統(tǒng)開(kāi)機(jī)畫(huà)面分為下面三個(gè)階段:
1. Linux 系統(tǒng)啟動(dòng),出現(xiàn)Linux小企鵝畫(huà)面(reboot)(Android 1.5及以上版本已經(jīng)取消加載圖片);
2. Android平臺(tái)啟動(dòng)初始化,出現(xiàn)"A N D R I O D"文字字樣畫(huà)面;
3. Android平臺(tái)圖形系統(tǒng)啟動(dòng),出現(xiàn)含閃動(dòng)的ANDROID字樣的動(dòng)畫(huà)圖片(start)。
?
1、開(kāi)機(jī)圖片(Linux小企鵝) (Android 1.5及以上版本已經(jīng)取消加載圖片);
Linux Kernel引導(dǎo)啟動(dòng)后,加載該圖片。
logo.c中定義nologo,在fb_find_logo(int depth)函數(shù)中根據(jù)nologo的值判斷是否需要加載相應(yīng)圖片。(源碼: 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;
? ?? ???......
}
相關(guān)代碼:
/kernel/drivers/video/fbmem.c
/kernel/drivers/video/logo/logo.c
/kernel/drivers/video/logo/Kconfig
/kernel/include/linux/linux_logo.h
2、開(kāi)機(jī)文字("A N D R I O D")
Android 系統(tǒng)啟動(dòng)后,init.c中main()調(diào)用load_565rle_image()函數(shù)讀取/initlogo.rle(一張565 rle壓縮的位圖),如果讀取成功,則在/dev/graphics/fb0顯示Logo圖片;如果讀取失敗,則將/dev/tty0設(shè)為TEXT模式,并打開(kāi)/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;
}
相關(guān)代碼:
/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軟件,將圖象轉(zhuǎn)換為RAW格式;
b. 使用android自帶的rgb2565工具,將RAW格式文件轉(zhuǎn)換為RLE格式(如:rgb2565 -rle < initlogo.raw > initlogo.rle)。
說(shuō)明:
在RK盒子上沒(méi)有顯示出R o c k c h i p?? R - B O X字樣是因?yàn)?/span>linux內(nèi)核配置的問(wèn)題。
打開(kāi)內(nèi)核framebuffer控制臺(tái)即可。
(1)make menuconifg后選擇Device Drivers->Graphics support->Console display driver support->Framebuffer Console support
然后打開(kāi)相關(guān)的幾個(gè)配置選項(xiàng)即可。
3、開(kāi)機(jī)動(dòng)畫(huà)(閃動(dòng)的ANDROID字樣的動(dòng)畫(huà)圖片)
Android 1.6及以上版本:
init.c解析init.rc(其中定義服務(wù):“service bootanim /system/bin/bootanimation”),bootanim服務(wù)由SurfaceFlinger.readyToRun()(property_set("ctl.start", "bootanim");)執(zhí)行開(kāi)機(jī)動(dòng)畫(huà)、bootFinished()(property_set("ctl.stop", "bootanim");)執(zhí)行停止開(kāi)機(jī)動(dòng)畫(huà)。
BootAnimation.h和BootAnimation.cpp文件放到了/frameworks/base/cmds/bootanimation目錄下了,增加了一個(gè)入口文件bootanimation_main.cpp。Android.mk文件中可以看到,將開(kāi)機(jī)動(dòng)畫(huà)從原來(lái)的SurfaceFlinger里提取出來(lái)了(,生成可執(zhí)行文件: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后,可以直接運(yùn)行“bootanimation”來(lái)重新看開(kāi)機(jī)動(dòng)畫(huà),它會(huì)一直處于動(dòng)畫(huà)狀態(tài),而不會(huì)停止。
(2)adb shell后,命令“setprop ctl.start bootanim”執(zhí)行開(kāi)機(jī)動(dòng)畫(huà);命令“getprop ctl.start bootanim”停止開(kāi)機(jī)動(dòng)畫(huà)。這兩句命令分別對(duì)應(yīng)SurfaceFlinger.cpp的兩句語(yǔ)句:property_set("ctl.start", "bootanim");和property_set("ctl.stop", "bootanim");
相關(guān)文件:
/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
說(shuō)明:
android開(kāi)機(jī)動(dòng)畫(huà)的源碼位于frameworks/base/cmds/bootanimation下,這個(gè)程序會(huì)將/data/local/bootanimation.zip或/system/media/bootanimation.zip里面的png或者jpg圖片以動(dòng)畫(huà)的形式播放出來(lái)。
首先,我們先來(lái)分析一下源碼:
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()
進(jìn)入一個(gè)if判斷語(yǔ)句
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(); //執(zhí)行android字體閃動(dòng)的圖片
?} else{
?r =movie(); //執(zhí)行bootanimation.zip中提供的動(dòng)畫(huà)圖片
?}
==> BootAnimation::Android()會(huì)加載"images/android-logo-mask.png"和"images/android-logo-shine.png"
==> BootAnimation::movie()會(huì)加載bootanimation.zip中的內(nèi)容
RK提供的源碼里默認(rèn)是沒(méi)有那些個(gè).zip動(dòng)畫(huà)的,所以總會(huì)跳到android字體閃動(dòng)的畫(huà)面
所以如果要用.zip的動(dòng)畫(huà)那么只要把做好的動(dòng)畫(huà)拷貝到編譯好對(duì)應(yīng)的目錄下即可,如果想修改android閃動(dòng)的那兩張圖片的話,最簡(jiǎn)單的方法是直接替換圖片,那兩張圖片在./frameworks/base/core/res/assets/images? 目錄下,一張鏤空的android圖,一張發(fā)光效果,動(dòng)畫(huà)效果就是下面那張發(fā)光的效果圖不斷左右移動(dòng)。
?
/frameworks/base/core/res/assets/images/android-logo-mask.png
Android默認(rèn)的前景圖片,文字部分鏤空,大小256×64
/frameworks/base/core/res/assets/images/android-logo-shine.png
Android默認(rèn)的背景圖片,有動(dòng)感效果,大小512×64
總結(jié)
以上是生活随笔為你收集整理的Android开机logo修改方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何修改Android应用程序能够使用的
- 下一篇: Android 4.0 Notifica