打包和解压Android系统中的system.img

我们在完整编译android系统的时候,最终会生成几个重要的镜像文件,其中有system.img、userdata.img、boot.img等。system.img是其中最为重要的一个,img中采用的文件系统通常为yaffs2或者ext。在开机启动过程中,它被init进程通过解析init.rc文件挂载(mount)到/system目录或者说system分区下。

1 生成system.img镜像文件

在源码目录中可以通过make systemimage和make snod生成system.img镜像文件,make snod是忽略依赖直接打包system.img,编译过程更快。具体生成过程由下图所示。

build-system-img.jpeg

图1  system.img编译过程

根据android版本不同,最后使用的镜像生成工具也不同,在android 8.1下有两个工具用来生成镜像文件,他们分别是make_f2fs和make_ext4fs。在build_image.py调用刚才提到的工具生成镜像文件,比如以下这条命令:

make_ext4fs -s -T 1421464178 -S file_contexts -l 1073741824 -a system system.img system/

1.1 make_ext4fs命令说明

  • -s 表示安静处理,不输出动作,可选参数
  • -T 表示 Unix 时间戳,对 system.img 中的文件设置修改时间
  • -S 表示 sepolicy 的 file_contexts
  • -l 表示最大的文件大小(受限于分区大小)
  • -a 表示 Android 的挂载(mount)点
  • system.img 表示输出文件名
  • system/ 表示输入目录

2 解压system.img镜像文件

通过file命令可以查看文件格式,如果输出是Linux rev 1.0 ext4 filesystem data,则表明是raw文件,如果输出是VMS Alpha executable,则表明是yaffs2文件,如果输出是data,则表明是ext文件。

file system.img
system.img: data

2.0.1 查看raw格式的system.img的内容

raw格式表明system.img是一个完整的分区镜像,可以直接用于挂载,使用下面的命令即可查看system的内容。

mkdir system
sudo mount -t ext4 system.img system

2.0.2 解压yaffs2格式的system.img

下载unyaffs源码,然后执行下面命令编译得到unyaffs可执行文件,然后执行unyaffs对镜像进行解压。

gcc -o unyaffs unyaffs.c
unyaffs system.img

2.0.3 解压ext格式的system.img

ext格式的system.img需要先通过simg2img工具把system.img转为为ext4文件格式,该工具位于out/host/linux-x86/bin/simg2img。经过转换之后会得到一个system.ext4.img,它是raw格式的完整镜像,可以使用上面介绍的方法进行查看。

simg2img system.img system.ext4.img