一、img文件解包
1.1 boot image解包
1.1.1 准备boot解包工具
单编system/core/mkbootimg模块,在out/host/linux-x86/bin/目录会生成mkbootimg和unpack_bootimg可执行文件。
其中mkbootimg可将kernel/dtb/ramdisk打包成boot.img,unpack_bootimg可以将boot.img解包。
1 | # 单编生成mkbootimg和unpack_bootimg |
也可以直接使用system/core/mkbootimg目录的mkbootimg.py和unpack_bootimg.py脚本来完成打包、解包工作。
1.1.2 使用boot解包工具
1.使用mkbootimg.py脚本创建boot.img
1 | #mkbootimg.py [-h] --kernel KERNEL [--ramdisk RAMDISK] [--second SECOND] |
2.使用unpack_bootimg.py脚本解压boot.img
1 | #unpack_bootimg.py [-h] --boot_img BOOT_IMG [--out OUT] |
1 | $ file unpack_boot_image/* |
可参考dtbo image解包
可以将boot.dtb和boot_recovery.dtb解包:
1 | unpack_boot_image/dtb_unpack$ out/host/linux-x86/bin/mkdtimg dump dtb --out boot_dtb.dump --dtb boot_dtb.dtb |
1 | $ out/host/linux-x86/bin/mkdtimg dump recovery_dtbo --out boot_recovery_dtbo.dump --dtb boot_recovery_dtbo.dtb |
可参考ramdisk image解包
可以将ramdisk解包:
1 | # 解压gz格式ramdisk |
1.2 dtbo image解包
1.2.1 准备dtbo解包工具
1.编译dtb工具
单编system/libufdt/utils/src木块,在out/host/linux-x86/bin/目录能找到mkdtimg(新系统采用mkdtboimg.py来替代)。
也可以直接使用system/libufdt/utils/src/mkdtboimg.py脚本。
1 | # 单编生成mkdtimg和mkdtboimg.py |
2.编译dtc工具
可以单编kernel/scripts/dtc目录,会在out/host/linux-x86/bin/目录生成dtc可执行文件。dtc可以将dtb转换为dts文件。
1 | #单编生成dtc |
1.2.2 使用dtbo解包工具
1.使用新的创建dtbo.img脚本
1 | #mkdtboimg.py [-h] {create,cfg_create,dump,help} ... |
2.使用旧的创建dtb文件工具
1 | #./out/host/linux-x86/bin/mkdtimg dump <image_file> (<option>...) |
3.将dtb转换为dts文件
1 | #Usage: dtc [options] <input file> |
1.3 ramdisk image文件解包
1.3.1 准备ramdisk解包工具
1 | # 安装gunzip和cpio |
1.3.2 使用ramdisk解包工具
用file指令可以获知ramdisk.img是zip格式的压缩文件。
1 | $ file ramdisk.img |
将ramdisk.img文件重命名为ramdisk.gz,用gunzip命令解压它。
1 | cp ramdisk ramdisk.gz |
用file指令可以获知解压后的ramdisk文件是cpio格式的文件,然后将其重命名为ramdisk.cpio文件。
接着使用cpio指令可将其挂载。
1 | $ file ramdisk |
1.4 super image文件解包
1.4.1 准备super解包工具
可以单编system/extras/partition_tools模块,在out/host/linux-x86/bin目录生成lpdump、lpmake、lpunpack文件。
其中lpdump可以dump super image信息;lpmake可以打包super image文件;lpunpack可以解包super image文件。
1 | mmm system/extras/partition_tools/ |
1.4.2 使用super解包工具
1.使用lpmake创建super.img
1 | #./out/host/linux-x86/bin/lpmake [options] |
2.使用lpdump获取super.img结构信息
1 | # 查看super.img类型 |
1 | #./out/host/linux-x86/bin/lpdump [-s <SLOT#>|--slot=<SLOT#>] [-j|--json] [FILE|DEVICE] |
3.使用lpunpack解包super.img
1 | #./out/host/linux-x86/bin/lpunpack [options...] SUPER_IMAGE [OUTPUT_DIR] |
二、sparse和ext4格式img文件转换
2.1 用file指令查看img类型
在Android中,为了压缩image文件大小,ext4类型image文件通常会被转为sparse格式存储。可以linux环境下可以用file $image
来查看image文件类型,如:
1 | # sparse类型 |
2.2 准备sparse/ext4格式转换工具
可以单编system/core/libsparse模块,将会在out/host/linux-x86/bin目录生成img2simg和simg2img可执行文件。
其中img2simg ext4.img sparse.img
可将ext4格式image转换为sparse格式;simg2img sparse.img ext4.img
可将sparse格式image转换为ext4格式。
1 | # 单编libsparse |
可以使用system/core/libsparse目录的simg_dump.py脚本dump sparse类型文件的结构信息,也可以单编该模块后用out/host/linux-x86/bin/simg_dump可执行文件。
2.3 使用sparse/ext4格式转换工具
1 | #simg_dump.py [-v] [-s] [-c <filename>] sparse_image_file ... |
可以用十六进制工具(如hexdump)打开sparse格式image文件,你会发现header包含0xed26ff3a的magic和major_version,minor_version等信息。
1 | $ hexdump cache_sparse.img |
type | length(bytes) | example |
---|---|---|
magic | 16 | 0xed26ff3a |
major_version | 16 | 0x0001 |
minor_version | 16 | 0x0000 |
file_hdr_sz | 16 | 0x001c |
chunk_hdr_sz | 16 | 0x000c |
blk_sz | 32 | 0x1000 |
total_blks | 32 | 0x0001b000 |
total_chunks | 32 | 0x0000000e |
image_checksum | 32 | 0x00000000 |
chunk_type_raw | 16 | 0xcac1 |