linux环境下如何精简system.img文件

一、准备

1、虚拟机安装程序下载

2、下载ubuntu iso文件下载

3、准备要修改的system.img文件

二、安装虚拟机

1、下载虚拟机安装程序后,双击打开后,一直选择下一步,当然也可以修改虚拟机的名字,虚拟机安装好后,打开它,点击创建新的虚拟机

2、点击下一步

3、选择下载的ubuntu镜像文件

4、设置用户名及密码

5、设置虚拟机名字及工作路径

6、设置碰盘容量,根据自己需求修改就好,一般默认就可以,点击下一步

7、点击完成ubuntu虚拟开始运行啦,开机有点慢啊,等待下啦

8、然后安装VMware Tool,大功告成

三、开始修改

Linux解包命令是sudo mount -o rw,loop system.img XX(XX是解包存放的文件夹,最好是同一个目录下的),打包命令是sudo umount XX,删除命令rm,切换用户为管理员用户命令su,当切换用户不成功时使用sudo su命令切换,命令可以在网上查看用法,费话不多说,快看如何使用这些命令吧(普通用户命令符是$,管理员的是#)

1、VMware Tool安装了,物理机与虚拟机可以相互传输文件了,在虚拟机中创建新的文件夹system,桌机空白区域右键,选择New Folder命名为system,进入system目录,然后把物理机里的system.img复制到虚拟机中

2、在system文件夹里再创建一个test 文件,让解包的system.img文件存放在test文件夹中便于管理,然后在system文件夹的空白处,右键选择Open in Terminal

3、需要使用超级管理员用户进行操作,使用sudo su命令切换用户

4、使用命令解包啦

5、使用解包命令没有任何错误提示信息,说明解包成功啦

1)cd test 进入test目录

2)ls  查看test目录里的文件

3)cd app 进入app目录,刷机包里的apk存放在这个目录里

4)ls或ls -l查看app目录里的apk

6、当然可以进入tes目录查看内容不用命令

7、在app目录下,使用rm命令删除内置的apk文件

8、精简完成后,回到system目录下,使用umount test命令打包,打包成功后,看不到新生成的system.img,因为新生成的system.img覆盖了旧的system.img文件,可以看到test目录中没有文件了

9、然后把system.img文件复制粘贴到主机也就是物理机上,替换原刷机包中的system.img文件就可以了

上述来源: http://www.yzmg.com/romzhushou/103261.html

另外的一个 记录 修改 system.img的例子

Android4.4 模拟器system.img制作
原创 2015年11月05日 17:48:06 1911
近日,对4.4版本的模拟器作了一些了解。网上的资料还是蛮多的,不过都比较杂乱,在这里主要是做一个整理吧。
4.4版本的system.img使用的ext4文件系统,所以mkyaffs2image不再适用。
如果仅仅是解包system.img的话,有部分工具可以做到。例如:ext4_unpacker.exe。至于打包工具,鄙人还未找到类似的工具(如果哪位同道找到类似的工具,希望可以提出来讨论)。好了,下面就说说我的解/打包过程:
1、众所周知,android的底层是linux。我们此处对system.img的操作也要在linux下进行。如果你使用的是windows,可以使用Vmware虚拟机,安装linux操作系统。我使用的是ubuntu。
2、我们可以在/boot目录下(也可以是别的目录,下面的文件名亦可修改)新建3个文件夹:
新建/boot/work:主要的工作空间
新建/boot/system:用于挂载sdk中原本的system.img镜像
新建/boot/newsystem:用于挂载新制作的ext4格式镜像

3、在网上下载make_ext4fs工具(下面地址提供)。
a)将make_ext4fs、mkuserimg.sh、simg2img三个文件拷贝到/boot/work目录下。
b)将sdk中的system.img拷贝到/boot/work目录下(例如我sdk中system.img的路径为:\adt-bundle-windows-x86-20131030\sdk\system-images\android-19\armeabi-v7a)。
c)制作新的system空白镜像,下面以制作300M的newsystem.img为例:
生成镜像文件:# dd if=/dev/zero of=newsystem.img count=614400
将镜像文件制作ext4文件系统:#./make_ext4fs newsystem.img
更改权限:#chmod 666 newsystem.img
好了,准备工作完成。
4、挂载镜像
a) 挂载镜像system.img到/boot/system目录
# mount -t ext4 -o loop system.img /boot/system
b) 挂载镜像newsystem.img到/boot/newsystem目录
# mount -t ext4 -o loop newsystem.img /boot/newsystem

挂载好之后,我们只要打开/boot/system和/boot/newsystem目录,就可以看到system.img和newsystem.img中所对应的类容。如下图:

可以看到,system中有很多内容,而newsystem中只有lost+found。现在我们可以对system作任意修改(比如删除掉app里的apk)。修改完之后我们利用cp命令将system中的内容拷贝到newsystem文件文件夹中。然后,解除挂载。

至此,/boot/work目录下的system.img及newsystem.img都修改完成。这两个镜像的内容完全一样,只是system.img的大小还是原本的大小,而newsystem.img减小为300M。当然,如果你不需要修改镜像的大小,直接使用system.img就可以了,newsystem.img也不用创建。
5、注:userdata.img亦可用此方法制作。水平有限,如有不足,请见谅。

make_ext4fs工具下载地址 http://download.csdn.net/detail/sichuandazhou/9244871

 

android中system.img的打包过程
原创 2015年01月17日 11:40:44

标签:
Android system image

我们来看一个制作system.img的命令实例:
$ ./make_ext4fs -s -T 1421464178 -S file_contexts -l 1073741824 -a system system.img system/

参数说明:
// -s 表示安静处理,不输出动作,可以不带该参数
// -T 表示Unix时间戳,对system.img中的文件设置修改时间,可以到搜索“站长之家 时间戳”获取某个时间点的时间戳;
// -S 表示sepolicy 的file_contexts
// -l 表示最大的文件大小(受限于分区大小);
// -a 表示Android的mount点,比如system、userdata、recovery;
// system.img 表示输出文件名;
// system/ 表示输入目录,该目录下有framework、app、bin等目录;

这里需要对file_contexts进行一下说明,该文件是对selinux文件系统的说明,一般在原来镜像文件的root目录下可以找到,如果自己修改/增加/删除了执行文件,可能需要对文件进行修改。具体的内容比较复杂,需要selinux的知识,这里不说了。
-l表示最大的文件大小,受限制于分区大小,如果制作出来的分区镜像大于该值,将会提示失败,这里使用1GB=1073741824B,一般比较新的手机都已经具备该大小了。
这里得到是一个经过压缩的img,无法直接进行mount。如果需要mount后查看,可以通过simg2img命令进行转换然后进行mount:
$ ./simg2img system.img system.ext4.img
$ sudo mount -t ext4 system.img mnt/
当然,如果不需要查看文件,我们只需要拿到system.img就好。system.ext4.img除了在主机上查看文件,对于打包过程没有帮助。

其实制作system.img非常简单简单,这里写出来主要是为了后面一片制作android-5.0以上更新包的博文做一个参考引用。

make_ext4fs和simg2img是两个linux的执行文件,如果有Android源代码,它们是编译后的结果,出现在out/host/linux-x86/bin/目录中。
这里也提供下载路径方便下载:
make_ext4fs: http://download.csdn.net/detail/howellzhu/8370473
simg2img: http://download.csdn.net/detail/howellzhu/8370479

 

Android 解压和重新打包system.img
开始我们的工作前,请记住,Linux一定要学会用file命令分析文件类型,这样才好入手,否则错了都不知道怎么回事!!!

1、解压system.img

先用file命令查看system.img的文件类型

file system.img
system.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (needs journal recovery) (extents) (large files)

看到没 ext4 filesystem data

那好办,采用挂载分区的方式来打开system.img文件

mount -t ext4 -o loop system.img systemimg //此命令的意思将system.img镜像文件挂载到systemimg目录

cd systemimg

android标准的文件结构就出来了,里面可以“随意”定制
2、重新打包生成system.img

打包命令:

./make_ext4fs -l 1024M -s -a system system_new.img systemimg

参数解析:1024M代表你要打包的system.img大小,这个值可以参考挂载前system.img的大小

"-a system",是指这个img用于android系统,挂载点是/system,使用这个参数,make_ext4fs会根据private/android_filesystem_config.h里定义好的权限来给文件夹里的所有文件重新设置权限,如果你刷机以后发现有文件权限不对,可以手工修改android_filesystem_config.h来添加权限,重新编译make_ext4fs,也可以不使用 “-a system”参数,这样就会使用文件的默认权限。

system_new.img代表新生成的img

systemimg就是上面挂载后的目录

一般很多人认为这样生成的system_new.img就可以用了,其实不然

再次用file命令查看文件类型

file system_new.img
system_new.img: data

跟之前的输出截然不同,这显然不是ext4文件类型,啥情况???

方法就是继续使用simg2img工具将其转换成真正的ext4文件

./simg2img system_new.img system_out.img

得到system_out.img

file system_out.img

system_out.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)

怎么样?这次得到的img就是ext4了吧?ok,那么这个system_out.img就是我们重新打包生成的img了,这就可以烧到手机里面看看效果了。。。

PS:上面提到的make_ext4fs simg2img等工具在android环境的out/host/linux-x86/bin目录下。

 

Android中system.img的两种格式及其相互转换方法
原创 2015年01月26日 22:49:40 标签:Android /system /image 14575
搞Android的同学经常会接触到system.img。但是该文件经常以两种格式出现:raw和sparse。

一种是raw ext4 image,即经常说的raw image,使用file观察它:
其特点是完整的ext4分区镜像(包含很多全零的无效填充区),可以直接使用mount进行挂载,因此比较大(一般1G左右)。
[plain] view plain copy
$ file system.img
system.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)
信息非常明确了。

另一种是sparse ext4 image,即经常说的simg,使用file观察它:
[plain] view plain copy
$ file system.img
system.img: data
就是说是一个非常普通的dat文件。由于它将raw ext4进行稀疏描述,因此尺寸比较小(没有全零的无效填充区,一般在300到500M之间)。

android本身提供了源代码工具在两者之间转换,源代码位于:
[plain] view plain copy
system/core/libsparse/simg2img.c // 将sparse image转换为raw image;
system/core/libsparse/img2simg.c // 将raw image转换为sparse image;

如果完整的进行过一次Android的编译,默认会将simg2img当作主机工具编译出来,放在out/host/linux-x86/bin/simg2img处。
但默认是不会编译img2simg的,我们可以手工进行编译:
[plain] view plain copy
$ . build/envsetup.sh
$ lunch aosp_hammerhead-userdebug
$ make img2simg_host

这样就会编译出out/host/linux-x86/bin/img2simg。
如果要将system.raw.img转换为system.simg:
$ img2simg system.raw.img system.simg

为了方便没有源代码的同学,这里提供img2simg的下载路径:

http://download.csdn.net/detail/howellzhu/8399215

对于simg2img,到处都可以找到了,还有windows版本的,这里就不提供了。
使用方法:
[plain] view plain copy
$ simg2img <sparse_image_files> <raw_image_file>
$ img2simg <raw_image_file> <sparse_image_file> [<block_size>]

欢迎转载,但是请注明出处:http://weibo.com/howellzhu