1. 程式人生 > >Android中system.img的兩種格式raw,sparse及其相互轉換方法

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

搞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=da594c53-9beb-f85c-85c5-cedf76546f7a, volume name "system" (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(編譯自己的product)
$ make img2simg_host(Android.mk裡面有很多LOCAL_MODULE:libsparse,img2simg_host,sing2img,append2simg等,需要哪個就編譯哪個)
這樣就會編譯出out/host/linux-x86/bin/img2simg。 如果要將system.raw.img轉換為system.simg: $ img2simg system.raw.img system.simg
對於simg2img,到處都可以找到了,還有windows版本的,這裡就不提供了。 使用方法:
$ simg2img
Usage: simg2img <sparse_image_files> <raw_image_file>
$ img2simg
Usage: img2simg <raw_image_file> <sparse_image_file> [<block_size>]

參考文章