原文:http://blog.csdn.net/wh_19910525/article/details/8200372
如有侵權(quán),敬請(qǐng)告知,謝謝
Android 產(chǎn)品中,內(nèi)核格式是Linux標(biāo)準(zhǔn)的zImage,根文件系統(tǒng)采用ramdisk格式。這兩者在Android下是直接合并在一起取名為boot.img,會(huì)放在一個(gè)獨(dú)立分區(qū)當(dāng)中。這個(gè)分區(qū)格式是Android自行制定的格式。
在制作手機(jī)ROM時(shí),有時(shí)會(huì)單獨(dú)編譯內(nèi)核或抽出根文件進(jìn)行修改內(nèi)容,比如我只編譯內(nèi)核,其余的地方不變。這樣重新安裝巨大的Android開(kāi)發(fā)環(huán)境實(shí)在不劃算。因此很多boot.img解包工具被人開(kāi)發(fā)出來(lái),這一些工具都是把內(nèi)核和根文件系統(tǒng)從一個(gè)現(xiàn)成的boot.img抽取出來(lái),修發(fā)后再次打包還原。
一.常見(jiàn)的解包工具
因?yàn)閎oot.img的格式比較簡(jiǎn)單,它主要分為三大塊(有的可能有四塊)
+—————–+因此很多人開(kāi)發(fā)分析工具,有是linux shell腳本,比如repack-zImage,也有人采用perl,還有C語(yǔ)言編寫(xiě)的 unbootimg,
| 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)
我使用的是在源碼位置system/core/mkbootimg/ 下的 mkbootimg。為了簡(jiǎn)化,藍(lán)點(diǎn)工坊把與mkbootimg中打包工具和解包工具以及所包含的libmincrpty庫(kù)抽出來(lái),并且重寫(xiě)一個(gè)Makefile,作為開(kāi)源項(xiàng)目。
使用者只需要在linux(需安裝gcc,make,一般是標(biāo)配)或windows(需要安裝mingw)的命令行執(zhí)行make,即可產(chǎn)生可執(zhí)行文件 mkbootimg ,unpackbootimg。
二.解/打包工具使用
解包工具:unpackbootimg
usage: unpackbootimg常見(jiàn)格式
-i|–input boot.img
[ -o|--output output_directory]
[ -p|--pagesize ]
這一句命令行表示把boot.img解包,所有文件輸出到out目錄下
它會(huì)解壓出如下文件:
boot.img-zImage (內(nèi)核文件)
boot.img-ramdisk.gz (根文件系統(tǒng)打包文件)boot.img-base (mkbootimg base參數(shù))
H:\ttt>mkbootimg.exe常見(jiàn)的命令格式:
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>
聯(lián)系客服