Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> [Android系統的移植與平台開發]定制手機模擬器ROM

[Android系統的移植與平台開發]定制手機模擬器ROM

編輯: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。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved