編輯:Android開發實例
一、 修改化定制Android4.0系統
Android系統啟動時,先加載Linux內核,在Linux的framebuffer驅動裡可以定制開機界面,Linux內核啟動成功後,掛載根文件系統,啟動Android系統,這個時候設備屏幕上開始出現滾動的Android動畫,等全部的Android服務啟動完畢之後,開始啟動Android的HOME界面,也就是桌面。
而在這個過程中,我們可以將開機界面和Android動畫全部定制為自己需要的效果。
在整個開機過程中,屏幕上會出現三次內容:
Ø Linux啟動時畫面,通常是個黃嘴的小企鵝
Ø Android系統本地啟動階段畫面,是“ANDROID”文字字樣
Ø Android系統顯示系統啟動階段動畫,是滾動的ANDROID動畫
我們下面將三個過程中的屏幕內容都進行個性化設置。
1. 定制手機開機界面
根據前面文章介紹,我們要在Linux的framebuffer驅動裡修改一些代碼,讓屏幕上出現我們自己的一個開機圖片,如下圖所示效果。
在Linux系統中,LCD顯示設備的驅動都是基於framebuffer的,framebuffer我們可以看成是Android的顯存,只要我們向該顯存裡寫入數據,這些數據就可以顯示在LCD上。
根據不同的LCD所支持的顏色可以分為:16位色,24位色,32位色。
學過初中物理都知道,色彩由三元色:紅(R),綠(G),藍(B)組成。
Ø 16位色:一個像素點由16bit表示,占兩個字節,RGB組成分為:565或555二種
Ø 24位色:一個像素點由24bit表示,占三個字節,RGB每個顏色由8位組成。
Ø 32位色:一個像素點由32bit表示,占四個字節,除了RGB每個顏色8位外,還有8位的Alpha的透明度,共組成32位。
很明顯,位數越高,可顯示的色彩越豐富,相同像素的LCD占用的顯存越大,現在手機和平板基本上都使用32位色的LCD。
Android模擬器裡使用16位565格式顯示驅動。
既然如此,那麼出現在framebuffer裡的應該是16位的具體顏色值,我們從怎麼知道一個圖片的RGB的值呢?
還好,我們使用一款叫Image2Lcd的軟件,可以將一個指定的bmp位圖格式圖片轉換成指定的RGB格式數據的數組中。
如下圖所示:
選擇好圖片,設置好寬度和高度及顏色位數,保存成一個頭文件mylogo.h,打開裡面內容如下:
const unsigned char bmp[307200] = { /* 0X00,0X10,0X40,0X01,0XE0,0X01,0X01,0X1B, */
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
…
};
那麼我們可以直接將這個頭文件拷貝到內核目錄中,包含到驅動裡,然後直接通過bmp數組名訪問圖片內容。
Ø 修改goldfish的fb驅動文件:
drivers/video/goldfishfb.c
在裡面添加一個繪制Logo圖片函數draw_logo,如下所示:
191 // MichaelTang add for bootlogo
192 #include "mylogo.h"
193 static intdraw_logo(structgoldfish_fb *fb)
194 {
195 int height = fb->fb.var.yres;
196 int width = fb->fb.var.xres;
197
198 printk("---------> h = %d, w = %d\n", height, width);
199 memcpy(fb->fb.screen_base, bmp, height*width*2);
200 return 0;
201 }
Ø 在goldfish_fb_probe函數裡調用我們剛才添加的draw_logo函數:
204 static intgoldfish_fb_probe(structplatform_device *pdev)
{
…
312 // MichaelTang add for bootlogo
313 draw_logo(fb);
...
}
重新編譯goldfish內核,然後將模擬器的內核指定為新編譯的內核,啟動後效果如下圖所示:
當然,這兒的實驗只是在Android的模擬器上實現的,如果在真實設備上,其步驟和上述一樣,只不過驅動文件可能不一樣,修改的位置不太一樣,其原理是一樣的。不過最後蘋果和三星專利大戰再次敲響,希望蘋果有一天別來找我,否則,賣腎都賠不起,現在腎也不值錢了。
2.定制Android啟動字樣
當Linux啟動完畢之後,開始掛載根文件系統ramdisk.img,通過命令行指定Linux運行Linux系統裡的第一個用戶進程init:
init程序由system/core/init/目錄下的源碼編譯而成,其入口文件為:init.c,console_init_action函數就是用來打開console終端,然後在屏幕上打印“A N D R O I D”字樣的,如果想修改這個值,則直接將其內容修改了,重新編譯init程序,然後重新生成system.img即可,不過,一般是將其內容注釋掉。
538 static intconsole_init_action(intnargs, char **args)
539 {
…
548 fd = open(console_name, O_RDWR);
549 if (fd>= 0)
550 have_console = 1;
551 close(fd);
552
553 if( load_565rle_image(INIT_IMAGE_FILE) ) {
554 fd = open("/dev/tty0", O_WRONLY);
555 if (fd>= 0) {
556 const char *msg;
557 msg = "\n"
558 "\n"
559 "\n"
560 "\n"
561 "\n"
562 "\n"
563 "\n" // console is 40 cols x 30 lines
564 "\n"
565 "\n"
566 "\n"
567 "\n"
568 "\n"
569 "\n"
570 "\n"
571 " A N D R O I D ";
572 write(fd, msg, strlen(msg));
573 close(fd);
574 }
575 }
576 return 0;
577 }
修改完之後,操作步驟如下:
$ souece build/envsetup.sh
$ mmm system/core/init
$ makesnod
重新啟動模擬器,可以發現ANDROID字樣發生了相應的改變。
3. 定制Android動畫
Android系統過程中會滾動Android字樣的一個動畫,我們可以根據自己的需要,定制這個開機動畫,如下圖所示:
Android的開機動畫是由Linux本地程序bootanimation控制實現的,其代碼在:frameworks/base/cmds/bootanimation/,通過分析源碼可知,修改Android開機動畫有兩種方式:
Ø 替換frameworks/base/core/res/assets/images/目錄下的兩個圖片文件:android-logo-mask.png和android-logo-shine.png,android-logo-mask.png是镂空蒙板png圖片,android-logo-shine.png是镂空蒙板後面的閃光png圖片
Ø 在/data/local/或/system/media/目錄創建bootanimation.zip文件
bootanimation.zip文件打包前的結構為:
desc.txt 動畫屬性描述文件
part0/ 第一階段動畫圖片的目錄(動畫是由一幀幀圖片組成的)
part1/ 第二階段動畫圖片的目錄
bootanimation.zip文件是直接由這幾個文件打包的,打包的格式是ZIP,並且要指定用壓縮打包方式(就是在打包時的壓縮方式選擇為存儲)。
desc.txt文件的格式為:
480 250 15
p 1 0 part0
p 0 10 part1
其中各個參數的意義為:
480
250
15
圖片的寬
圖片的高
每秒顯示幀數
p
1
0
part0
標識符
循環的次數
階段切換間隔時間
對應圖片目錄
p
0
10
part1
標識符
循環的次數
階段切換間隔時間
對應圖片目錄
注:
標識符:p 是必須的。
循環次數:指該目錄中圖片循環顯示的次數,0表示本階段無限循環。
每秒顯示幀數:就是每秒顯示的圖片數量,決定每張圖片顯示的時間。
階段切換間隔時間:指的是該階段結束後間隔多長時間顯示下一階段的圖片,其單位是每張圖片顯示的時間。
對應圖片目錄:就是該階段動畫的系列圖片,以圖片文件目錄的順序顯示動畫,而且圖片的格式必須要為PNG。
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
(效果如上圖所示) 其實很簡單: 比方說上面的容器是一個ListView 代碼如下: <ListView android:id=@+id/listView
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
在android上導入zxing.jar包,總是報錯: Could not find class com.google.zxing.MultiFormatWrit