Android 打包解包的流程及工具make_ext4fs simg2img使用说明
1、使用makefs 制作img
先看看make_ext4fs的用法
xxx@AndroidServer:~/Tmp$ make_ext4fs
Expected filename after options
make_ext4fs [ -l ] [ -j ] [ -b ]
[ -g ] [ -i ] [ -I ]
[ -L
raw data format
raw ext4 image,其特点是完整的ext4分区镜像(包含很多全零的无效填充区),可以直接使用mount进行挂载
xxx@AndroidServer:~/Tmp$ make_ext4fs -l 3000M vendor.raw.img vendor/
Creating filesystem with parameters:
Size: 3145728000
Block size: 4096
Blocks per group: 32768
Inodes per group: 8000
Inode size: 256
Journal blocks: 12000
Label:
Blocks: 768000
Block groups: 24
Reserved block group size: 191
Created filesystem with 4152/192000 inodes and 700980/768000 blocks
xxx@AndroidServer:~/Tmp$
xxx@AndroidServer:~/Tmp$ file vendor.raw.img
vendor.raw.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)
xxx@AndroidServer:~/Tmp$
xxx@AndroidServer:~/Tmp$ ls -lh vendor.raw.img
-rw-r--r-- 1 xxx xxx 3.0G Dec 26 14:35 vendor.raw.img
sparse data format
如果带 -s 参数呢
xxx@AndroidServer:~/Tmp$ make_ext4fs -l 3000M -s vendor.s.img vendor/
Creating filesystem with parameters:
Size: 3145728000
Block size: 4096
Blocks per group: 32768
Inodes per group: 8000
Inode size: 256
Journal blocks: 12000
Label:
Blocks: 768000
Block groups: 24
Reserved block group size: 191
Created filesystem with 4152/192000 inodes and 700980/768000 blocks
xxx@AndroidServer:~/Tmp$
xxx@AndroidServer:~/Tmp$ file vendor.s.img
vendor.s.img: data
xxx@AndroidServer:~/Tmp$
xxx@AndroidServer:~/Tmp$ ls -lh vendor.s.img
-rw-r--r-- 1 xxx xxx 2.7G Dec 26 14:37 vendor.s.img
这里file 和size 就看到两者的差别了
sparse 格式是一个非常普通的dat文件。由于它将raw ext4进行稀疏描述,因此尺寸比较小(没有全零的无效填充区,一般在300到500M之间)。
目前Android 制作的img 都是sparse data的
以system img 为例
./make_ext4fs -s -T -1 -S out/target/product/ronny_box/root/file_contexts -l 1024M -a system system.img systemimg
./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就是上面挂载后的目录
Raw/Sparse 格式转换
Android本身提供了源代码工具在两者之间转换,源代码位于:
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的,我们可以手工进行编译:
$ . build/envsetup.sh
$ lunch your_product
$ make img2simg_host
用法也比较简单
$ simg2img
Usage: simg2img
$ img2simg
Usage: img2simg []
举例将刚刚生成的img来做转换 vendor.s.img -> vendor.raw.img
xxx@AndroidServer:~/Tmp$ file vendor.s2r.img
vendor.s2r.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)
xxx@AndroidServer:~/Tmp$
xxx@AndroidServer:~/Tmp$ ls -lh vendor.s2r.img
-rw-rw-r-- 1 xxx xxx 3.0G Dec 26 14:45 vendor.s2r.img
挂载ext文件分区
raw ext4 image,完整的ext4分区镜像可以直接挂载
xxx@AndroidServer:~/Tmp$ mkdir mount_vendor
xxx@AndroidServer:~/Tmp$ sudo mount vendor.s2r.img mount_vendor/ -o loop
参考链接
https://blog.csdn.net/u011006622/article/details/85836640
https://blog.csdn.net/jingwen3699/article/details/81807024