| 
 | 
 
 
大家都知道安卓的核心更換呢,那是在boot.img裡面,那麼如何在WINDOWS下去解開它呢,LINUX的自己略過。。。。 
 
首先下載 booting.exe,這得感謝製作bootimg.exe的作者,本來是為華為的機器做的分解工具,不過我們也可以拿來分解boot.img、recovery.img等,OK!先來談談這兩個文件的基礎,部分來自網絡。 
 
boot和recovery映像的文件結構 
boot和recovery映像並不是一個完整的文件系統,它們是一種android自定義的文件格式,該格式包括了2K的文件頭,後面緊跟著是用gzip壓縮過的內核,再後面是一個ramdisk內存盤,然後緊跟著第二階段的載入器程序(這個載入器程序是可選的,在某些映像中或許沒有這部分)。此類文件的定義可以從源代碼android-src/system/core/mkbootimg找到一個叫做bootimg.h的文件。 
(譯者的話,原文是一個叫做mkbootimg.h的文件,但從Android 2.1的代碼來看,該文件名應該是改為bootimg.h了)。 
/* 
** +-----------------+  
** | boot header | 1 page 
** +-----------------+ 
** | kernel | n pages  
** +-----------------+ 
** | ramdisk | m pages  
** +-----------------+ 
** | second stage | o pages 
** +-----------------+ 
** 
** n = (kernel_size + page_size - 1) / page_size 
** m = (ramdisk_size + page_size - 1) / page_size 
** o = (second_size + page_size - 1) / page_size 
** 
** 0. all entities are page_size aligned in flash 
** 1. kernel and ramdisk are required (size != 0) 
** 2. second is optional (second_size == 0 -> no second) 
** 3. load each element (kernel, ramdisk, second) at 
** the specified physical address (kernel_addr, etc) 
** 4. prepare tags at tag_addr. kernel_args[] is 
** appended to the kernel commandline in the tags. 
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 
** 6. if second_size != 0: jump to second_addr 
** else: jump to kernel_addr 
*/ 
ramdisk映像是一個最基礎的小型文件系統,它包括了初始化系統所需要的全部核心文件,例如:初始化init進程以及init.rc(可以用於設置很多系統的參數)等文件。如果你您希望瞭解更多關於此文件的信息可以參考以下網址: 
http://git.source.android.com/?p=kernel/common.git;a=blob;f=Documentation/filesystems/ramfs-rootfs-initramfs.txt 
以下是一個典型的ramdisk中包含的文件列表:  
./init.trout.rc 
./default.prop 
./proc 
./dev 
./init.rc 
./init 
./sys 
./init.goldfish.rc 
./sbin 
./sbin/adbd 
./system 
./data  
 
recovery映像包含了一些額外的文件,例如一個叫做recovery的二進製程序,以及一些對該程序支持性的資源圖片文件(當你您按下home+power組合鍵的時候就會運行這個recovery程序)。 
典型的文件列表如下:  
- ./res
 
 - ./res/images
 
 - ./res/images/progress_bar_empty_left_round.bmp
 
 - ./res/images/icon_firmware_install.bmp
 
 - ./res/images/indeterminate3.bmp
 
 - ./res/images/progress_bar_fill.bmp
 
 - ./res/images/progress_bar_left_round.bmp
 
 - ./res/images/icon_error.bmp
 
 - ./res/images/indeterminate1.bmp
 
 - ./res/images/progress_bar_empty_right_round.bmp
 
 - ./res/images/icon_firmware_error.bmp
 
 - ./res/images/progress_bar_right_round.bmp
 
 - ./res/images/indeterminate4.bmp
 
 - ./res/images/indeterminate5.bmp
 
 - ./res/images/indeterminate6.bmp
 
 - ./res/images/progress_bar_empty.bmp
 
 - ./res/images/indeterminate2.bmp
 
 - ./res/images/icon_unpacking.bmp
 
 - ./res/images/icon_installing.bmp
 
 - ./sbin/recovery
 
  複製代碼 看到以上結構的時候就已經很奇特了,那麼怎麼來解開它,以及打包呢!馬上揭曉! 
 
看到我叫大家百度BOOTIMG.EXE,也許大家又在大叫坑爹了,沒辦法,本人天生懶人一個啊!下載這個東西之後,那就一切皆有可能啦!解開後,至於修改,那麼就八仙過海,各顯神通了! 
 
工具主要語言為python,分兩處版本,源文件及windows下可執行文件exe,內容及用法完全一致。 
 
運行方法: 
 
bootimg.py 功能 參數 
 
目前支持以下功能: 
 
--repack-ramdisk, 生成 ramdisk 
--unpack-ramdisk, 解開 ramdisk 
--repack-bootimg, 生成 bootimg (包括boot.img及recovery.img) 
--unpack-bootimg, 解開 bootimg 
--unpack-updata, 解開 updata 
--unpack-yafffs, 解開 yafffs 
--unpack-rle, 解開rle,生成raw格式及png圖片(如果pil可用, exe裡有pil) 
--repack-rle, 生成rle,可支持多種格式 
 
 
下面一一說明功能中的參數。 
 
--unpack-updata [文件] 
[文件]為空時,默認使用UPDATA.APP 
解開後,會有四個文件,boot.img, recovery.img, system.img, userdata.img 
這些都是刷機時可能需要的。 
 
--unpack-bootimg [文件] 
[文件]為空時,默認使用boot.img 
解開後,會有兩個文件,kernel和ramdisk.gz 
同時,注意輸出,比如base, cmdline, name等等 
 
--repack-bootimg [base] [cmdline] 
[base]為空時,使用0x200000 (C8600默認) 
[cmdline]為空時,使用mem=211 console=null androidboot.hardware=qcom (c8600適用) 
生成bootimg時,會使用kernel和ramdisk.gz(如果存在ramdisk.cpio.gz,優先使用),生成boot.img 
 
實際上啊,就是在WINDOWS下更方便而已,在這裡要感謝製作這個軟件的人,非常感謝中! 
 
- 開始-運行-cmd
 
 - d:回車
 
 - cd boot回車
 
 - bootimg --unpack-bootimg
 
  複製代碼 
 
  
僅需要以上命令就會解開boot.img了! 
 
如果是recovery.img那麼改名為boot那麼不是照樣能行了,呵呵,看到木有,哈哈!分解就是那麼簡單,按照上面命令,合成就如下了: 
 
bootimg --repack-bootimg 
 
OK!好了,修改大家就自己去奮鬥吧,其實說實話,安卓本來基於LINUX就是在那系統下玩的,用WINDOWS的就比較吃虧了。 
如上,在windows下編輯的完全壓力很大的說,前面談那麼多啥base基址,cmdline命令行啊這些,就是為了在微軟下用這個工具打包時候好做這些工作,看圖,分解boot.img後出現的情況 
 
 
 
 
 
 
 
 
到這裡就完全打包解包無壓力了,額,recovery解包打包,就直接把他搞成boot.img封包後再搞回去就行了的。 
 |   
 
 
 
 |