1. 程式人生 > >boot.img的解包與打包

boot.img的解包與打包

轉自:http://blog.csdn.net/wh_19910525/article/details/8200372

Android 產品中,核心格式是Linux標準的zImage根檔案系統採用ramdisk格式。這兩者在Android下是直接合並在一起取名為boot.img,會放在一個獨立分割槽當中。這個分割槽格式是Android自行制定的格式。

 

Android開發時,最標準的做法是重新編譯於核心和根檔案系統,然後呼叫Android給的命令列檔案mkbootimg(out/host/linux-x86/bin/)來打包。

在製作手機ROM時,有時會單獨編譯核心或抽出根檔案進行修改內容,比如我只編譯核心,其餘的地方不變。這樣重新安裝巨大的Android開發環境實在不划算。因此很多boot.img解包工具

被人開發出來,這一些工具都是把核心和根檔案系統從一個現成的boot.img抽取出來,修發後再次打包還原。

 

一.常見的解包工具

因為boot.img的格式比較簡單,它主要分為三大塊(有的可能有四塊)

+—————–+
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)

因此很多人開發分析工具,有是linux shell指令碼,比如repack-zImage,也有人採用perl,還有C語言編寫的 unbootimg,

 

 

我使用的是在原始碼位置system/core/mkbootimg/ 下的 mkbootimg。為了簡化,藍點工坊把與mkbootimg中打包工具和解包工具以及所包含的libmincrpty庫抽出來,並且重寫一個Makefile,作為開源專案。
使用者只需要在linux(需安裝gcc,make,一般是標配)或windows(需要安裝mingw)的命令列執行make,即可產生可執行檔案 mkbootimg ,unpackbootimg

 

二.解/打包工具使用

解包工具:unpackbootimg

usage: unpackbootimg
-i|–input boot.img
[ -o|--output output_directory]
[ -p|--pagesize ]

常見格式
unpackbootimg -i .\tmp\boot.img -o .\out

這一句命令列表示把boot.img解包,所有檔案輸出到out目錄下

 

它會解壓出如下檔案:

boot.img-zImage (核心檔案)

boot.img-ramdisk.gz (根檔案系統打包檔案)
boot.img-cmdline (mkbootimg cmdline引數)
boot.img-pagesize (mkbootimg pagesize引數)

boot.img-base (mkbootimg base引數)

 

打包工具:mkbootimg (Android自帶)

H:\ttt>mkbootimg.exe
error: no output filename specified
usage: mkbootimg
        --kernel <filename>
       --ramdisk <filename>

       [ --second <2ndbootloader-filename> ]
       [ --cmdline <kernel-commandline> ]
       [ --board <boardname> ]
       [ --base <address> ]
       [ --pagesize <pagesize> ]
        -o|--output <filename>

常見的命令格式:
./mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel zImage --ramdisk boot/boot.img-ramdisk.gz -oboot.img --base 02e00000
這句含義是把核心檔案zImage和boot目錄下的根檔案壓縮包 boot.img-ramdisk.gz打包成boot.img.
其中cmdline和base的值均來源於unpackbootimg的結果