目的
Android Rom打包后,根据类型,粗略分为固件包和普通卡刷包;不管是固件包(如:三星Odin固件包),还是卡刷包(如:GSI通刷包)。为了操作方便,有时会打包成system.img格式。现在就带大家在Linux上挂载system.img。
得到镜像文件
以三星固件包为例,其他手机品牌可以参考:Github 解包开源项目
我解压的是SM-A505U_1_20191216162802(美版三星A50)。下载后,固件名称为SM-A505U_1_20191216162802_rru9m4tdds_fac.zip。解压这个文件:
1unzip SM-A505U_1_20191216162802_rru9m4tdds_fac.zip
得到:
BL_A505USQS3ASL4_CL16561534_QB27874851_REV00_user_low_ship.tar.md5
AP_A505USQS3ASL4_CL16561534_QB27874851_REV00_user_low_ship_meta_OS9.tar.md5
CP_A505USQS3ASL4_CP14622435_CL16561534_QB27874851_REV00_user_low_ship.tar.md5
HOME_CSC_OMC_OYN_A505UOYN3ASL4_CL16561534_QB27874851_REV00_user_low_ship.tar.md5
CSC_OMC_OYN_A505UOYN3ASL4_CL16561534_QB27874851_REV00_user_low_ship.tar.md5
USERDATA_CCT_A505USQS3ASL4_CL16561534_QB27874851_REV00_user_low_ship.tar.md5
用file命令校验,发现这些就是tar压缩文件,三星使用md5结尾,方便Odin检测md5数值。
所以,我们用tar的解压命令,解压AP文件:
1tar xvf AP_A505USQS3ASL4_CL16561534_QB27874851_REV00_user_low_ship_meta_OS9.tar.md5
在解压的文件里,就有我们system.img.lz4,这个是进过lz4压缩后的img镜像文件。
提取system.img
其实刚刚就在提取了,这一步;我们把system.img.lz4文件解压
1lz4 -d system.img.lz4
得到system.img镜像文件。如果无法识别lz4命令:
1
2
3# Ubuntu
apt-get update
apt-get install liblz4-tool
1
2
3# Centos
yum install lz4
yum install lz4-devel
校验system.img类型
使用文件file命令:
1file system.img
可能会有以下结果:
system.img: Android sparse image, version: 1.0, Total of 1510400 4096-byte output blocks in 33 input chunks.
system.img: Linux rev 1.0 ext2 filesystem data, UUID=873a602a-a04c-5918-94d6-e1f574def67e (extents) (large files) (huge files)
上面两个比较常见,还有这种不常见:
VMS Alpha executable
以上三种,类型方便为:ext 文件、raw 文件和yaffs2 文件。
判断
ext文件
首先,需要用 simg2img 工具把 system.img 转为为 ext4 文件格式,该工具位于 out/host/linux-x86/bin/simg2img,可以使用apt-get安装:
1apt-get install simg2img
再使用工具进行转换:
1simg2imgsystem.imgsystem_new.img
会得到一个 system_new.img,它是 raw 格式的完整镜像:
1
2root@iZxf3axaooao5qZ:/Cloud/SM# file system_new.img
system_new.img: Linux rev 1.0 ext2 filesystem data, UUID=873a602a-a04c-5918-94d6-e1f574def67e (extents) (large files) (huge files)
yaffs2文件1gcc -o unyaffs unyaffs.c
创建一个 system 目录,将 unyaffs 和 system.img 放到 system 目录中,然后执行命令,即可解压到当前目录
1unyaffs system.img
raw文件
这个是最舒服的了,Linux上直接挂载即可:
创建一个system的目录用来挂载:
1mkdir system
用Linux挂载命令进行挂载:
1sudo mount -t ext4system_new.imgsystem
ext文件和raw文件区别
raw 其特点是完整的ext4分区镜像(包含很多全零的无效填充区),可以直接使用mount进行挂载,因此比较大
ext 就是说是一个非常普通的dat文件。由于它将raw ext4进行稀疏描述,因此尺寸比较小(没有全零的无效填充区)
所以,我们只需要用脚本(simg2img),进行一次编译操作,就可以把ext文件编译、转换成raw文件了。