天天看點

Android中system.img的兩種格式及其互相轉換方法

 搞Android的同學經常會接觸到system.img。但是該檔案經常以兩種格式出現:raw和sparse。

一種是raw ext4 image,即經常說的raw image,使用file觀察它: 其特點是完整的ext4分區鏡像(包含很多全零的無效填充區),可以直接使用mount進行挂載,是以比較大(一般1G左右)。

$ file system.img
system.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)
           

資訊非常明确了。

另一種是sparse ext4 image,即經常說的simg,使用file觀察它:

$ file system.img
system.img: data
           

就是說是一個非常普通的dat檔案。由于它将raw ext4進行稀疏描述,是以尺寸比較小(沒有全零的無效填充區,一般在300到500M之間)。

android本身提供了源代碼工具在兩者之間轉換,源代碼位于:

system/core/libsparse/simg2img.c // 将sparse image轉換為raw image;
system/core/libsparse/img2simg.c // 将raw image轉換為sparse image;
           

如果完整的進行過一次Android的編譯,預設會将simg2img當作主機工具編譯出來,放在out/host/linux-x86/bin/simg2img處。 但預設是不會編譯img2simg的,我們可以手工進行編譯:

$ . build/envsetup.sh
$ lunch aosp_hammerhead-userdebug
$ make img2simg_host
           

這樣就會編譯出out/host/linux-x86/bin/img2simg。 如果要将system.raw.img轉換為system.simg: $ img2simg system.raw.img system.simg

為了友善沒有源代碼的同學,這裡提供img2simg的下載下傳路徑: http://download.csdn.net/detail/howellzhu/8399215

對于simg2img,到處都可以找到了,還有windows版本的,這裡就不提供了。 使用方法:

$ simg2img <sparse_image_files> <raw_image_file>
$ img2simg <raw_image_file> <sparse_image_file> [<block_size>]
           

歡迎轉載,但是請注明出處:http://weibo.com/howellzhu