Android项目生成的镜像文件包括ramdisk.img, system.img, userdata.img
ramdisk.img 是out/target/product/项目名/root 目录经过打包压缩而成; system.img是out/target/product/项目名/system目录打包压缩而成; userdata.img是out/target/product/项目名/data目录经过打包压缩而成。
Android启动时,会把ramdisk挂载为rootfs(根文件系统"\"),把system.img挂载到ramdisk.img下面的system目录,把userdata.img挂载到ramdisk.img下面的data目录。
用file XX.img来查看一下这几个文件的类型
经file命令查看后可以发现ramdisk.img是gzip的压缩格式,system.img和userdata.img是executable格式。不同格式采用不同的解压和压缩方法。
首先来解压ramdisk.img
1、将ramdisk.img拷贝到一个临时目录tmp下面
cp ramdisk.img /tmp
cd tmp
2、修改ramdisk.img的文件名为ramdisk.img.gz
mv ramdisk.img ramdisk.img.gz
3、解压
gunzip ramdisk.img.gz
解压后生成ramdisk.img文件,查看该文件格式是cpio archive
4、用cpio命令提取内容
当前目录下新建一个目录ramdisk,内容将提取到该目录下
然后你可以对ramdisk下面的相关文件做修改。注意ramdisk下的data和system目录分别由userdata.img和system.img挂载,所以往这个里面加东西最终在机器上将miss!,要往这里面加东西需要修改userdata.img或者system.img(后面将说明)。
修改完之后就可以进行重新打包啦~, 打包可以继续使用cpio命令,也可以使用Android自带的mkbootfs工具,mkbootfs在Android工程下的out/host/linux-x86/obj/EXECUTABLE/mkbootfs_intermedidatas/mkboofs
回到tmp目录,拷贝mkboofs到tmp目录下,并移除原来的ramdisk.img文件
使用mkbootfs打包ramdisk目录,这一步将在tmp目录下面生成新的ramdisk.img。这个ramdisk.img就可以替换手机端或者sdk中的ramdisk.img了(为了避免错漏,替换之前务必备份原档)
========================================================================================================
system.img以及userdata.img的解包和打包,两种文件格式一样,这里我们就以system.img 为例
需要用到两个工具:unyaffs、mkyaffs2image。unyaffs可以从android官网下载源码编译得到(网上也有编译好的版本),mkyaffs2image在Android源码的out/host/linux-x86/bin/mkyaffs2image。
1、在tmp目录下新建system目录,并拷贝以上的两个工具以及system.img到该目录下面:
2、使用unyaffs解包system.img
3、解包后出现system目录就是终端中根目录下的system,在这里我们可以往该目录(当然也包括子目录)添加或修改。然后使用mkyaffs2image来重新打包
以上是关于Android中img文件的解包,和打包,感谢您的阅读~