原文網址:http://blog.csdn.net/wh_19910525/article/details/8200372linux
Android 產品中,內核格式是Linux標準的zImage,根文件系統採用ramdisk格式。這二者在Android下是直接合並在一塊兒取名爲boot.img,會放在一個獨立分區當中。這個分區格式是Android自行制定的格式。shell
Android開發時,最標準的作法是從新編譯於內核和根文件系統,而後調用Android給的命令行文件mkbootimg(out/host/linux-x86/bin/)來打包。windows
在製做手機ROM時,有時會單獨編譯內核或抽出根文件進行修改內容,好比我只編譯內核,其他的地方不變。這樣從新安裝巨大的Android開發環境實在不划算。所以不少boot.img解包工具被人開發出來,這一些工具都是把內核和根文件系統從一個現成的boot.img抽取出來,修發後再次打包還原。工具
一.常見的解包工具
由於boot.img的格式比較簡單,它主要分爲三大塊(有的可能有四塊)ui
+—————–+
| 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,spa
我使用的是在源碼位置system/core/mkbootimg/ 下的 mkbootimg。爲了簡化,藍點工坊把與mkbootimg中打包工具和解包工具以及所包含的libmincrpty庫抽出來,而且重寫一個Makefile,做爲開源項目。
使用者只須要在linux(需安裝gcc,make,通常是標配)或windows(須要安裝mingw)的命令行執行make,便可產生可執行文件 mkbootimg ,unpackbootimg。.net
二.解/打包工具使用
解包工具:unpackbootimg命令行
usage: unpackbootimg
-i|–input boot.img
[ -o|--output output_directory]
[ -p|--pagesize ]
常見格式
unpackbootimg -i .\tmp\boot.img -o .\outblog
這一句命令行表示把boot.img解包,全部文件輸出到out目錄下ci
它會解壓出以下文件:
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的結果