本篇文章讲解 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