本篇文章講解 system.img 是什麼東西,以及它的打包和解包方式css
system.img 是 Android 系統中用來存放系統文件的鏡像 (image) ,文件格式爲 yaffs2 或者 ext 的文件系統 ,在 Android 源碼編譯後會生產該文件。它將被 init 進程經過解析 init.rc 文件掛載 (mount) 到 /system 目錄或者說 system 分區下linux
使用下面的命令來便可製做一個 system.imgandroid
$ make_ext4fs -s -T 1421464178 -S file_contexts -l 1073741824 -a system system.img system/
命令說明
make_ext4fs
用於製做 Android 平臺上 ext4 文件系統的鏡像
參數說明
-s
表示安靜處理,不輸出動做,可選參數
-T
表示 Unix 時間戳,對 system.img 中的文件設置修改時間
-S
表示 sepolicy 的 file_contexts
-l
表示最大的文件大小(受限於分區大小)
-a
表示 Android 的掛載(mount)點,好比 system、userdata、recovery,make_ext4fs
會根據 private/android_filesystem_config.h
裏定義好的權限來給文件夾裏的全部文件從新設置權限,若是不指定 -a
參數,則使用默認權限
system.img
表示輸出文件名
system/
表示輸入目錄,該目錄下有 framework、app、bin 等目錄
命令執行完成後,會獲得一個通過壓縮的 system.img ,沒法直接進行mount,咱們後面具體會介紹如何查看 system.img 中的內容數組
system.img 是包含在系統刷機包裏面的,解壓刷機包,一般會有兩種狀況bash
在 Android 5.0 之前的版本(不包含 5.0),經過解壓刷機包能夠直接獲得 system.img ,而 system.img 多是 raw、yaffs2 或者 ext 的文件系統
使用 file
命令能夠區分 system.img 的文件系統格式app
$ file system.img
若是輸出是 Linux rev 1.0 ext4 filesystem data ,則代表是 raw 文件
若是輸出是 VMS Alpha executable ,則代表是 yaffs2 文件
若是輸出是 data ,則代表是 ext 文件工具
Linux rev 1.0 ext4 filesystem data 代表 system.img 是一個完整的分區鏡像,能夠直接用於掛載,使用下面的命令便可查看 system 的內容google
$ mkdir system $ sudo mount -t ext4 system.img system
下載 unyaffs 源碼,而後執行下面命令編譯獲得 unyaffs 可執行文件spa
$ gcc -o unyaffs unyaffs.c
建立一個 system 目錄,將 unyaffs 和 system.img 放到 system 目錄中,而後執行命令,便可解壓到當前目錄code
$ unyaffs system.img
首先,須要用 simg2img 工具把 system.img 轉爲爲 ext4 文件格式,該工具位於 out/host/linux-x86/bin/simg2img
工具用法
$ simg2img system.img system.ext4.img
會獲得一個 system.ext4.img ,它是 raw 格式的完整鏡像,能夠使用上面介紹的方法進行查看
在 Andriod 5.0 之後的版本,爲了下降update.zip文件的大小和寫入的數據量,全部的ROM包,都仿照增量包的方式進行打包了,咱們解壓刷機包,會獲得如下三個帶有 system 的文件
system.new.dat system.patch.dat system.transfer.list
system.new.dat文件其實是由system.transfer.list描述的一個稀疏數組,使用 sdat2img
工具便可轉換獲得真正的 system.img
$ sdat2img system.transfer.list system.new.dat system.img
前兩個參數分別是 trans list 文件和輸入的 system.new.dat 文件,最後一個是輸出的 system.img 文件名,生成的文件能夠直接用於 ext4 的 mount