分享

android中image文件的压缩与解压缩

 dwlinux_gs 2014-10-31

        我们将android源码进行编译之后,会在out/target/product/<product-name>/目录下生成几个image文件:system.img,recovery.img,userdata.img等,将这些image文件连同一些bin文件烧写到机器的nand flash之后(利用专门的烧写工具),便可以启动系统了。由于项目的原因,近日接触了有关这些image文件的操作,故将其整理成本文。

        在http://jinguo./blog/696902一文中,作者对几种img文件的类别及内容进行了细致深入的讲解。如其所言,系统下的几种image文件分为三类(通过执行file命令可以获得),分别是:data;VMS Alpha executable;gzip compressed data。显然,针对不同类型的image文件,其压缩解压缩的方式也各不相同(或许我们所关心的是件system.img,因为它便是我们所看到的android系统,通过对其进行修改,即可定制我们自己的系统)。http://jinguo./blog/696902文中作者开发平台所生成的system.img文件为VMS Appha executable类型,但事实上,在Android 2.3以前,system.img采用yaffs文件系统(即VMS Alpha executable),而Android 2.3之后则使用Linux中的ext4文件系统(即通过执行file命令显示为data)。本文搜集整理了三种类型image文件的压缩解压缩方式,以备不时之须。

1.gzip compressed data

图1 使用file命令查看文件类型

        上图显示的是我所使用的平台上提取的一套image文件,通过file命令可以看到,其中的ramdisk.img,ramdisk-recovery.img为gzip compressed data类型,而其他全都是data类型。我们首先说明gzip compressed data类型image文件的压缩与解压缩。

说明:为便于测试,我所使用的当前目录为test,并新建test/ramdisk_dir目录用于存放ramdisk.img最终解压所获得的文件。

        解压缩的过程如下:

(1) 由于gzip压缩文件的默认扩展名为.gz,因此在使用gzip对ramdisk.img文件进行解压时需首先更改其名称为ramdisk.img.gz:mv ramdisk.img ramdisk.img.gz

(2) 由图3可看到,将ramdisk.img.gz解压后又得到ramdisk.img,通过file命令可知其类型已变为cpio归档文件,之后再利用cpio命令将其copy至ramdisk_dir目录(见图4)

(3) ramdisk_dir即是ramdisk.img的目录结构,如图5所示。

图2 将ramdisk.img更名为ramdisk.img.gz

图3 将ramdisk.img.gz文件解压

图4 执行cpio命令

图5 ramdisk_dir目录(ramdisk.img解压后所得到的文件)

        压缩:将当前目录中的ramdisk.img文件删除,进入ramdisk_dir目录下使用命令find . | cpio -ov -H newc | gzip > ../ramdisk.img便可重新得到ramdisk.img文件。

图6 将ramdisk_dir目录压缩得到ramdisk.img

        备注: 关于步骤1,我们也可以通过参数-S来指定后缀名,此时第一步中所执行的命令为:gzip -d -S .img ramdisk.img,解压后将得到名称为ramdisk的cpio文件,将其输入到步骤2,可得到同样的结果。

2.data类型

        如前所述,本人所使用的平台为Android 4.0的版本,编译得到的system.img为data类型(即Linux中的ext4文件系统),其压缩与解压缩使用的工具为分别为make_ext4fs和simg2img,它们都是android自带的工具,在android编译后的out/host/linux-x86/bin目录中可找到。

        system.img的解压缩过程如下:

(1) 分别将需要解压的system.img与simg2img复制到test目录(目录任选);

(2) 执行命令simg2img进行解压:./simg2img system.img system.img.ext4;

(3) 创建目录tmp用来挂载system.img.ext4;

(4) 将system.img.ext4挂载至tmp目录:mount -t ext4 -o loop system.img.ext4 tmp/。

        进入tmp目录,便可浏览和修改目录文件了。

图7 system.img中的文件结构

        至于system.img文件的压缩,我们不妨看下android系统是如何操作的。system.img是由out/target/product/<product-name>/system中的内容压缩而来的,在android源码根目录下,通过执行make snod便可完成这一功能。

图8 make_ext4fs命令的执行

        图8是执行make_ext4fs命令的结果,从LOG信息中可以清晰的看到,系统执行了make_ext4fs -s -l 330000000 -a system out/target/product/sp8810ea/system.imgout/target/product/sp8810ea/system 命令,从而将system目录压缩成了system.img文件。其中-l参数表示文件的长度;-a参数指定挂载点,此处将挂载到设备根目录下的system目录上;最后两个参数则表示要输出的image文件名称和要转换的目录名称。-s参数很重要,其意义在于告诉make_ext4fs工具去掉空数据,如果不加该参数,则image文件的大小将等同于-l所指定的大小。

        有了上述描述,关于system.img的压缩也就一目了然了。

        备注:有关挂载等操作可能需要系统权限,使用时需要注意。

3.VMS Alpha executable

        解压过程如下:

(1) 下载文件unyaffs.c,unyaffs.h,地址为:http://code.google.com/p/unyaffs/downloads/list

(2) 编译,生成unyaffs文件;

图9 编译生成unyaffs文件

(3) 将(2)中得到的unyaffs文件复制到linux的bin目录中, 并修改其权限为777(注:此步需要系统管理员权限);

(4) 执行unyaffs system.img进行解压,我将system.img放在test目录下,并将其解压到system_dir目录中,执行命令及结果如下

        cd system_dir

        unyaffs ../system.img

图10 Android 2.3下的system.img解压

        备注:

(1) 当我们用unyaffs命令解压ext4文件类型的system.img时,报出的错误为:段错误;

(2) 在windows系统下,我们可以通过下载可视化yaffs解压工具yaffs2img浏览器来完成同样的功能。

        VMS Alpha executable压缩工具及命令如下:

(1) 工具:out/host/target/linux-x86/bin/mkyaffs2image

(2) 命令:mkyaffs2image system system.img

图11 使用mkyaffs工具压缩system_dir得到system.img

 

参考:

(1) http://jinguo./blog/696902

(2) http://blog.csdn.net/hancunai0017/article/details/6873948

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多