###1. boot.img & recovery.img
boot.img 和 recovery.img 并不是一个完整的文件系统的镜像,而是android自定义的一种文件格式,从头至尾依次为:
- 1page大小的文件头
- gzip压缩过的kernel.img(zImage,由vmlinux和解压程序组成)
- ramdisk内存盘(android采用的根文件系统)
- boot阶段stage 2的程序(可选的)
合并起来的boot.img会放到一个单独的分区中.
也就是说:
boot.img = zImage + ramdisk.img
recovery.img = zImage + recover-ramdisk.img(比正常的ramdisk.img多一些额外的资源)
boot.img recovery.img的生成, mkbootimg工具(out/host/linux-x86/bin/mkbootimg, 源码位于 system/core/mkbootimg) 例如:
$ mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel zImage --ramdisk boot/boot.img-ramdisk.gz -o boot.img --base 02e00000
官方源码并未附带 boot.img 和 recovery.img 的unpac工具, 但是存在许多的第三方工具。
###2. ramdisk.img
ramdisk.img 是一个cpio格式的压缩文件,有多unpack种方式, 如:
$ gunzip -c ../ramdisk.img | cpio -i
ramdisk.img的pack方式(out/host/linux-x86/bin/mkbootfs 和 out/host/linux-x86/bin/minigzip)
/out/host/linux-x86/bin/mkbootfs root/ | ./out/host/linux-x86/bin/minigzip > ramdisk.img
###3. system.img文件
在android2.3之后, 默认的文件系统是ext4,之前版本为yaffs2。虽然说默认的文件系统为ext4, 但是, 没有规范强制要求一定是ext4, 设备厂商也可以选择其它的文件系统,但是大部分还是使用默认的ext4.
虽然说linux原生支持ext4文件系统, 但是,编译android源码生成的img文件经过了转换, 已经不能被正确识别为ext4文件系统了,因此, 必须按照 unpack-modify-pack 的动作来进行修改:
//unpack (out/host/linux-x86-/bin/Simg2img)
# simg2img system.img system.img.raw
//mount
# mount -t ext4 system.img.raw /mnt
//modify
//umount
# umount /mnt
// pack (out/host/linux-x86/bin/make_ext4fs)
# make_ext4fs -s -l 512M -a system system.img system.img.raw
make_ext4fs的参数为:
- -s : 表示除去分区中的空数据,即生成的img为实际数据的大小, 而不是分区的大小
- -l : 指定分区的大小
- -a : 指定该分区在android上的挂载点