1. 程式人生 > >關於boot.img和recovery.img的修改和編輯

關於boot.img和recovery.img的修改和編輯

        關於boot.img和recovery.img的編輯和修改方面的文章,希望能夠為感興趣的朋友節約一些看資料的時間。感謝本文的作者:Alansj, DarkriftX, RyeBrye, Will, Try OP9, Tonyb486, Timmmm, Lxrose還有好多不知名的作者們在wiki上的不懈努力。

如何解包/編輯/大包boot.img檔案

很多人用自己的方式解決了boot.img的解包/編輯/打包的問題,有人要求我來寫一篇關於boot和recovery映像的檔案結構和如何對其編輯的文章,於是就有了下面這篇文章。

目錄
1、背景知識
2、boot和recovery映像的檔案結構
3、對映像檔案進行解包、編輯、打包的常規方法
3.1、另一種解包、編輯、打包的方法
4、將新的映像刷回到手機
5、解包、編輯、打包為我們帶來了什麼
6、本文講的內容與使用update.zip刷機包不是一碼事

正文

1、背景知識

Android手機的檔案系統有許多儲存器組成,以下是在adb shell下面的輸出:
#cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 04380000 00020000 "system"
mtd4: 04380000 00020000 "cache"
mtd5: 04ac0000 00020000 "userdata"

注意,不同的手機在上述儲存裝置的順序可能會各不相同!一定要檢查您的手機,確定在以下的操作中選擇正確的裝置號(mtdX,這個X的序號一定要檢查清楚)。
在本嚮導中,我們主要描述對"recovery"和"boot"的儲存裝置進行操作;"system"儲存裝置儲存了android系統目錄的所有資料(在系統啟動後會掛載到“system/”目錄);“userdata”儲存裝置將儲存了android資料目錄中的所有資料(在系統啟動後會掛載到“data/”目錄,裡面是會有很多應用資料以及使用者的preference之類的配置資料)。

從上面的輸出可以看出來,recovery和boot分割槽對應著/dev/mtd/mtd1和/dev/mtd/mtd2,在你您開始做任何修改之前一定要做兩件事情,第一件事情,一定要先對這兩個分割槽進行備份。

可以使用如下命令進行備份:
# cat /dev/mtd/mtd1 > /sdcard/recovery.img
# cat /dev/mtd/mtd2 > /sdcard/boot.img
(注意added by lxros,只有手機獲取了ROOT許可權以後才能夠執行上述的備份命令)

第二件事情,你您應該把你您最喜歡的update.zip刷機包放置到你您的sd卡的根目錄上面。如此一來,即使你您在後續的操作中出了問題,也可以啟動到recovery模式進行恢復。

另外一個你您需要知道的重要檔案是在android系統目錄下的/system/recovery.img,此檔案是mtd1儲存裝置的完全拷貝。這個檔案在每次關機的時候,會自動地被寫回到mtd1儲存裝置裡面。

這會意味著兩個事情:
(1)任何對/dev/mtd/mtd1中資料的直接修改都會在下一次重啟手機以後消失。

(2)如果希望對/dev/mtd/mtd1進行修改,最簡單的做法是用你您自己的recovery.img替換掉/system/recovery.img。當你您建立自己的update.zip刷機包的時候(特別是在做刷機包的適配的時候),如果你您忘記替換這個/system/recovery.img,這個recovery.img就會在關機的時候被燒寫到mtd1裡面去或許會變磚。一定要注意這一點!
(譯者的話,關於這個/system/recovery.img檔案,在2.1的android的平臺裡面並沒有找到,或許這個機制已經out了?!或者偶本人對這段話的理解不夠深入?!希望明白的朋友不吝斧正)

2、boot和recovery映像的檔案結構

boot和recovery映像並不是一個完整的檔案系統,它們是一種android自定義的檔案格式,該格式包括了2K的檔案頭,後面緊跟著是用gzip壓縮過的核心,再後面是一個ramdisk記憶體盤,然後緊跟著第二階段的載入器程式(這個載入器程式是可選的,在某些映像中或許沒有這部分)。此類檔案的定義可以從原始碼android-src/system/core/mkbootimg找到一個叫做bootimg.h的檔案。

(譯者的話,原文是一個叫做mkbootimg.h的檔案,但從Android 2.1的程式碼來看,該檔名應該是改為bootimg.h了)。
/*
** +-----------------+
** | 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
以下是一個典型的ramdisk中包含的檔案列表:
./init.trout.rc
./default.prop
./proc
./dev
./init.rc
./init
./sys
./init.goldfish.rc
./sbin
./sbin/adbd
./system
./data
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

3、對映像檔案進行解包、編輯、打包的常規方法

(注意,下面我給你您介紹的是手工命令列方式進行解包以及重新打包的方法,但是我仍然建立了兩個perl指令碼,這兩個指令碼可以讓你您的解包和打包工作變得輕鬆許多。可以參考本文的附件unpack-bootimg.zip和repack-bootimg.zip)

如果你您很擅長使用16進位制編輯器的話,你您可以開啟boot.img或者recovery.img,然後跳過開始的2K的頭資料,然後尋找一大堆0的資料,在這一堆0的資料後面,緊跟著1F 8B這兩個數字(1F 8B是gzip格式的檔案的結束標記)。從此檔案開始的地方(跳過2K的頭),一大堆0後面緊跟著到1F 8B這兩個數字為止的全部資料,就是gzip壓縮過的
Linux核心。從1F 8B後面緊跟著的資料一直到檔案的結尾包含的全部資料,就是ramdisk記憶體盤的資料。你您可以把把核心和ramdisk兩個檔案分別儲存下來,在進行分別的修改和處理。我們可以通過un-cpio和un-gzip操作來讀取ramdisk檔案中的資料,可以使用如下的命令來實現這個目的,以下操作會生成一個目錄,直接cd進去就可以看到ramdisk中的資料了:
gunzip -c ../your-ramdisk-file | cpio -i
此命令可以將ramdisk中的所有的檔案解包到當前的工作目錄下面,然後就可以對它進行編輯了。

當需要重新打包ramdisk的時候,就需要re-cpio然後re-gzip這些資料和目錄,可以通過如下命令來實現:(cpio會把所有當前目錄下面的檔案都打包進去,因此,在進行此步驟之前,請把不需要的檔案都清除掉。)
find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz
最後一步就是通過mkbootimg這個工具,把kernel和ramdisk打包在一起,生成一個boot.img:
mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel your-kernel-file --ramdisk newramdisk.cpio.gz -o mynewimage.img
這裡的mkbootimg工具會在編譯android的原始碼的時候會在~/android-src/out/host/linux-x86/bin目錄下面自動生成。
下載地址:
http://git.source.android.com/?p=platform/system/core.git;a=tree;f=mkbootimg

現在,如果不想背這些複雜的命令或者擺弄那個讓人眩暈的16進位制編輯器的話,可以嘗試使用我編寫的用於解包和打包的perl指令碼了。希望這些指令碼能夠節約各位的鍵盤。

3.1、另一種解包、編輯、打包的方法

下載split_bootimg.zip檔案(譯者注,會在本文的附件中提供),在此zip檔案中包含一個perl檔案,split_bootimg.pl指令碼,該指令碼可以讀取boot.img頭(根據Android原始碼中的bootimg.h讀取)將kernel和ramdisk讀取出來,此指令碼也會輸出核心命令列和板子名字。
(注意,不要使用從/dev/mtd/mtd2直接拷貝出來的boot.img,此映像可能在讀取過程遭到損壞。)
下面是一個從TC4-RC28更新中提取出來的boot.img進行解包操作:
% ./split_bootimg.pl boot.img
Page size: 2048 (0x00000800)
Kernel size: 1388548 (0x00153004)
Ramdisk size: 141518 (0x000228ce)
Second size: 0 (0x00000000)
Board name:
Command line: no_console_suspend=1
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.
解包ramdisk的命令如下:
% mkdir ramdisk
% cd ramdisk
% gzip -dc ../boot.img-ramdisk.gz | cpio -i
% cd ..
解碼完畢後,就可以修改了(例如,在default.prop設定ro.secure=0等等)

使用mkbootfs工具(mkbootfs工具是編譯完畢Android原始碼以後,就會在~/android-src/out/host/linux-x86/bin自動生成)來重新建立ramdisk,可以使用如下命令來操作:
% mkbootfs ./ramdisk | gzip > ramdisk-new.gz
使用mkbootimg來重新建立boot.img,mkbootimg也可以在~/android-src/out/host/linux-x86/bin目錄中可以找到:
% mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img
(注意:console=null的命令列選現是從TC4-RC30的boot.img引入的,用以去掉root shell)

4、將新的映像刷回到手機

可以將recovery.img拷貝到/system目錄下面,然後重新啟動手機,讓手機自動為你您刷寫到mtd裡面(工作原理在上面已經提過了)。對於boot.img可以通過將其拷貝到sd卡的根目錄,然後通過手機內的刷寫工具將此映像寫入到手機中。

例如,使用adb工具將boot.img拷貝到手機的sd卡的根目錄:
adb push ./mynewimage.img /sdcard
然後通過adb shell登入手機的shell互動模式,利用命令列進行互動:
# cat /dev/zero > /dev/mtd/mtd2
   write: No space left on device [this is ok, you can ignore]
# flash_image boot /sdcard/mynewimage.img
然後重啟。
如果能夠正常啟動,那麼祝賀你您,你您的修改和替換已經成功了;如果不能夠順利啟動,則需要重新啟動進入recovery模式,並且使用update.zip來恢復。

5、解包、編輯、打包為我們帶來了什麼

可以修改開機啟動時候的畫面

相關推薦

關於boot.imgrecovery.img修改編輯

        關於boot.img和recovery.img的編輯和修改方面的文章,希望能夠為感興趣的朋友節約一些看資料的時間。感謝本文的作者:Alansj, DarkriftX, RyeBrye, Will, Try OP9, Tonyb486, Timmmm, Lxr

通過ADB命令刷入boot.imgrecovery.img的方法

一個完整的官方rom解開如下所示boot.imgsystem.imgrecovery.imghboot.nb0data.imgcache.imgradio.img等等 我們所說的刷機也僅僅是boot.img引導分割槽加上system.img系統分割槽、那麼很多同學卡在第一屏

boot.imgrecovery.img結構說明

今天對boot.img和recovery.img結構做了研究,這是一個十分好玩的事情,當然,在android移植和編譯的過程中,也是需要有一定了解的。 Why: 其實為什麼要做這個瞭解呢,起源是源於S-ON的問題,當然,這個是HTC的加密方式,源於硬體,如果還有什麼其他

從Android boot.imgrecovery.img的解包中瞭解其資料組成

從Android boot.img與recovery.img的解包中瞭解其資料 又到了忙碌的季節,一次要處理N多事情。最近需要從boot.img中取出ramdisk。不同的專案中kernel是一樣的,ramdisk中的資源不一樣,直接取ramdisk與新編譯的kernel打包在一起,方便

boot.img recovery.img ramdisk.img ramdisk-recovery.img 解壓方法

1、下載工具 wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/android-serialport-api/android_bootimg_tools.tar.gz

模擬器中ramdisk.img或者recovery.img重新解壓打包步驟。

1、首先刪除img字尾 # gunzip -S .img ramdisk.img 2、檢視檔案型別 # file ramdiskramdisk: ASCII cpio archive (SVR4 with no CRC) 是一個cpio格式的檔案 3、解壓cpio檔案 #

imx6sl recovery.img 解包打包

1.工具 split_bootimg.pl (./device/fsl/common/tools/split_bootimg.pl) mkbootfs (./out/host/linux-x86/bin/mkbootfs) minigzip(./out/host/linux-x86/bi

編輯框中字型修改大小字號,顏色設定

首先要了解 CFont類,它 封裝了一個 Windows 圖形裝置介面( GDI)字型,併為操作字型提供了成員函式 。使用CreatFontW函式來建立字型。函式的原型如下:BOOL CreateFont( int nHeight, // 字型高度:0為預設高度,非0絕對值為字型高度in

使用fastboot工具刷入recovery.imgboot.img、system.img

解壓FastBoot工具.zip ,將解壓得到的 FastBoot資料夾複製到任意盤如:D盤,,將要刷入手機的recovery.img、recovery.img等放到FastBoot資料夾 安裝好手機型號對應的USB驅動,手機進入fastboot模式 開啟cmd,進

android系統映象:boot.img kernel.img ramdisk.img system.img userdata.img cache.img recovery.img

boot.img(kernel.img+ramdisk.img) ramdisk.img(/) system.img(/system) userdata.img(/data) cache.im

img.onload事件img.complete屬性的簡介應用

js部分:img.src="圖片"; img.onload=showImg; function showImg() {    程式碼部分。。。。 } 對於 complete 屬性來講,IE是根據圖片是否顯示過來判斷,就是說當載入的圖片顯示出來後,complete 屬性的值才為 true ,否則一直是 fal

imx平臺,通過fastboot燒寫boot.img system.img recovery.img映象

1.在串列埠上,進入u-boot模式,輸入fastbootMX6Q SABRESD U-Boot > fastbootfastboot is in init......flash target i

Snapshot在virshqemu-img中的使用

 snapshot  -c  base_sys_centos5.564bit.img  CentOS5.5_64bit.img 在現有映象基礎上建立一個快照。 報如下錯誤: emu-img: Could not create snapshot 'base_sys_centos5.564bit.img':-95

Android ramdisk.img 分析、解壓壓縮

一、ramdisk介紹 ramdisk通過直面意思就大概能理解意思,ram disk虛擬記憶體盤,將ram模擬成硬碟來使用的檔案系統。對於傳統的磁碟檔案系統來說,這樣做的好處是可以極大提高檔案訪問速度;但由於是ram,所以在掉電後,這部分內容不能儲存。ramdisk檔案系統

bos 第3天(easyui彈窗邊界問題、取派員的添加、修改批量刪除)

檔案 劃分 bug servle 手機號 rules function project rem BOS項目筆記 第3天 今天內容安排: 1、解決window窗口bug 2、bos項目整體需求分析(基礎設置、取派、中轉、路由、報表) 3、取派員添加功能 4、jQuery

織夢cms文章內容頁上下篇單獨獲得URL文章名稱修改

dedecms1、打開/include/arc.archives.class.php ,查找 $this->PreNext[‘pre‘] //約813行在其下一行插入:$this->PreNext[‘preurl‘] = "$mlink"; //上一篇鏈接地址$this->PreN

任務調度開源框架Quartz動態添加、修改刪除定時任務

star play cit box sport nts str ignorecas tar 作者:Joyce-Luo Quartz 是個開源的作業調度框架,為在 Java 應用程序中進行作業調度提供了簡單卻強大的機制。Quartz框架包含了調度器監聽、

關於vmware 5.5vmware6.0 修改 vsphere client 登陸名字

去掉域名登陸當用vsphere clinet 登陸vcenter的時候,用戶名總是需要輸入域名後([email protected]),方可登陸.如何使用戶名去掉域名,只用用戶登陸(administrator)。具體步驟如下: a.通過web client管理賬號登陸vcenter

spring boot 1.5.4 定時任務異步調用(十)

springboot springboot1.5.4 springboot之web開發 springboot定時任務 springboot異步回調 上一篇:spring boot1.5.4 統一異常處理(九) 1 Spring Boot定時任務和異步調用我們在編寫Spring B

MySQL:創建、修改刪除表

rop ont ... rst incr arc bigint 第一個 desc 1.創建數據庫:CREATE DATABASE 數據庫名;  刪除數據庫:DROP DATABASE 數據庫名;  查看數據庫編碼:SHOW CREATE DATABASE 數據庫名;