Android ROM客製化:boot.img、recovery解包打包
2019-11-29 08:24:34 其他

大家都知道安卓的核心更換呢,那是在boot.img裡面,那麼如何在WINDOWS下去解開它呢,LINUX的自己略過。。

1

大家都知道安卓的核心更換呢,那是在boot.img裡面,那麼如何在WINDOWS下去解開它呢,LINUX的自己略過。。。。首先百度BOOTIMG.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了)。
文是一個叫做mkbootimg.h的檔案,但從Android 2.1的程式碼來看,該檔案名應該是改為bootimg.h了)。

2

/*** +-----------------+ ** | 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
rnel 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

3

以下是一個典型的ramdisk中包含的檔案列表:./init.trout.rc./default.prop./proc./dev./init.rc./init./sys./init.goldfish.rc./sbin./sbin/adbd./system./data

4

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看到以上結構的時候就已經很奇特了,那麼怎麼來解開它,以及打包呢!馬上揭曉!
d.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看到以上結構的時候就已經很奇特了,那麼怎麼來解開它,以及打包呢!馬上揭曉!

5

看到以上結構的時候就已經很奇特了,那麼怎麼來解開它,以及打包呢!馬上揭曉!看到我叫大家百度BOOTIMG.EXE,也許大家又在大叫坑爹了,沒辦法,本人天生懶人一個啊!下載這個東西之後,那就一切皆有可能啦!解開後,至於修改,那麼就八仙過海,各顯神通了!工具主要語言為python,分兩處版本,原始檔及windows下可執行檔案exe,內容及用法完全一致。

6

執行方法: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,可支援多種格式

7

下面一一說明功能中的引數。

--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下更方便而已,在這裡要感謝製作這個軟體的人,非常感謝中!

比如要解開boot.img,假設我的位置D:oot,具體,命令如下:

開始-執行-cmd

d:回車

cd boot回車

bootimg   --unpack-bootimg


8

僅需要以上命令就會解開boot.img了!

如果是recovery.img那麼改名為boot那麼不是照樣能行了,呵呵,看到木有,哈哈!分解就是那麼簡單,按照上面命令,合成就如下了:

bootimg   --repack-bootimg

OK!好了,修改大家就自己去奮鬥吧,其實說實話,安卓本來基於LINUX就是在那系統下玩的,用WINDOWS的就比較吃虧了。如上,在windows下編輯的完全壓力很大的說,前面談那麼多啥base基址,cmdline命令列啊這些,就是為了在微軟下用這個工具打包時候好做這些工作,看圖,分解boot.img後出現的情況。


9

看圖中的base基址是0x200000,cmdline命令列是「mem=211M console=null androidboot.hardware=qcom",page-size是2048,padding-size是4096,那麼都要回編回去,接下來打包的時候就應該輸入以下命令
bootimg  --repack-bootimg  0x200000  "mem=211M console=null androidboot.hardware=qcom"  2048  4096
如下圖所示,OK!這才是真正的打包完成,就如果直接打包的話,華為中興的無所謂,不過其他機器就開不了機器了!


10

到這裡就完全打包解包無壓力了,額,recovery解包打包,就直接把他搞成boot.img封包後再搞回去就行了的。