ROM定製開發教程-boot recovery解包打包

一、解包打包

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

 

 

Android開發時,最標準的做法是重新編譯於內核和根文件系統,然後調用Android給的命令行文件mkbootimg(out/host/linux-x86/bin/)來打包。

在製作手機ROM時,有時會單獨編譯內核或抽出根文件進行修改內容,比如我只編譯內核,其餘的地方不變。這樣重新安裝巨大的Android開發環境實在不划算。因此很多boot.img解包工具被人開發出來,這一些工具都是把內核和根文件系統從一個現成的boot.img抽取出來,修發後再次打包還原。

 

 

1.常見的解包工具

 

因爲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。

 

 

 

2./打包工具使用

以下舉例常用的工具,方案2爲現有工具,已分享至github,更多工具可以在github上找到對應的開源項目

 

解包工具1unpackbootimg

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 -o boot.img --base 02e00000

這句含義是把內核文件zImage和boot目錄下的根文件壓縮包 boot.img-ramdisk.gz打包成boot.img.

其中cmdline和base的值均來源於unpackbootimg的結果

 

工具2:bootimg.exe

 

bootimg.exe功能:


解包命令:bootimg.exe –unpack-bootimg      
打包命令:bootimg.exe –repack-bootimg   
recovery/boot文件放到bootimg.exe同一級目錄即可。

更多命令:
–add-head
–cml
–cpio-list
–czlib
–dml
–dzlib
–remove-head
–repack-565
–repack-bootimg
–repack-ramdisk
–repack-rle
–repack-zte-bin
–rml
–to-ext4
–to-img
–uml
–unpack-565
–unpack-bootimg
–unpack-qsb
–unpack-ramdisk
–unpack-rle
–unpack-updata
–unpack-yafffs
–unpack-yaffs
–unpack-yaffs2
–unpack-zte-bin

 

 

 

二、注意事項

android 6之後,android開啓了system verify 簽名,未經簽名的image刷入不能開機,原因是system 掛載失敗。

 

解決辦法是修改分區掛載文件,去掉system的verify參數,高通平臺爲fstab.qcom

/dev/block/bootdevice/by-name/system    /system  ext4  ro,barrier=1,discard  wait,verify

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章