[ROM开发]解包打包ROM详细教程 2017.9.8更新安卓7.0


解包和打包system.img

直接挂载

 mount system.img /mnt/rom

修改后打包 file_contexts放在当前目录 即打包的img所在目录

 make_ext4fs -S ./file_contexts -l 1610612736 -s -a system system_out.img /mnt/rom

-l时按指定长度 1610612736既是指定长度

通过下面这命令查看大小 会显示xxx byts 

 fdisk -l system.img

打包后还不是Ext4用以下工具和命令

 ./simg2img system_out.img system_new.img

用以下命令可以查看是否为img格式是否为ext4 和原img比对类型

 file system_new.img

解压和打包安卓DAT文件

首先把DAT解压成IMG镜像,我们要使用sdat2img工具把 DAT文件转换成IMG镜像

 ./sdat2img <transfer_list> <system_new_file> <system_ext4> - <transfer_list> = input, system.transfer.list from rom zip - <system_new_file> = input, system.new.dat from rom zip - <system_ext4> = output ext4 raw image file

一个很简单的例子(看你用的啥):

 ./sdat2img system.transfer.list system.new.dat system.img

or

 ./sdat2img.py system.transfer.list system.new.dat system.img

新生成的IMG镜像便是我们下一步需要的.

挂载IMG镜像

 sudo mount -t ext4 -o loop system.img /mnt/rom

or

 sudo mount system.img /mnt/rom

这时候你可以在系统的 /mnt/rom目录下看到文件的具体内容然后进行修改了.

打包回IMG镜像-把修改好的内容打包回去需要使用make_ext4工具

 ./make_ext4fs -S ./file_contexts -l 1610612736 -s -a system system_out.img /mnt/rom

-l时按指定长度 1610612736既是指定长度 通过下面这命令查看大小 会显示xxx byts 

 fdisk -l system.img

打包后还不是Ext4用以下工具和命令

 ./simg2img system_out.img system_new.img

用以下命令可以查看是否为img格式是否为ext4 和原img比对类型

 file system_new.img

封装成DAT仍需要使用工具 使用 rimg2sdat (在安卓7.0,很可能会出现段存储错误)

./rimg2sdat <system_img>

例:

./rimg2sdat system_new.img

这样就打包好了新的DAT文件,放入刷机ROM.刷机即可~ 

file_contexts提取

解压rom得到boot.img 有的是BOOT.img

使用unpackbootimg工具

 ./unpackbootimg -i .\BOOT.img

解压后得到BOOT.img-ramdisk和其他一堆文件

只用找到BOOT.img-ramdisk,这是一个gzip的压缩包

直接解压即可得到file_contexts

参考:

http://blog.csdn.net/wh_19910525/article/details/8200372

工具:

https://github.com/osm0sis/mkbootimg

安卓7.0file_contexts提取

先安装工具包:

 sudo apt install abootimg

解包:

abootimg -x boot.img

得三个文件,其中有一个initrd.img,使用file命令查看为gzip

 file initrd.img initrd.img: gzip compressed data, from Unix

解压后得file_contexts.bin

 cat ./initrd.img | gunzip | cpio -vid

Android 7.0 file_contexts.bin和file_contexts转换工具

1、file_contexts.bin 转换成 file_contexts,命令如下:

 ./sefcontext -o file_contexts file_contexts.bin sefcontext

2、file_contexts 转换成 file_contexts.bin,命令如下:

 ./sefcontext_compile -o file_contexts.bin file_contexts

安卓7.0新版打包dat方式 使用rimg2sdat.py(这个工具使用的输入文件是sparse ext4fs image镜像)

由system目录制作raw ext4fs镜像system.rimg

 ./make_ext4fs -T 0 -S ./file_contexts -l 2013265920 -a system system.rimg /mnt/rom

简单解释一下,

-T代表对镜像中的unix文件时间戳进行设置,这里设置为0,表示1970-1-1。

-S 代表file_contexts,即selinux的文件selabel,必须指定;注意是大写S。

-l 表示文件分区的length,也是制作出来的镜像文件的大小;这里n5指定为1G。

-a 表示android中分区的名字,这里表示system分区;

/mnt/rom表示制作源目录。也就是你解包后挂载的那个目录

通过上面的步骤,得到一个2GB的文件system.rimg。这是一个ext4的文件,所以需要转化

 img2simg system.rimg sysparse.rimg

有人会说为什么不直接用-s生成sparse文件,

原因是:这两个文件是不一样的,至于为什么,我也不知道,可能工具有问题,没细究

第一个直接生成的:

file system_out.img 

system_out.img: Android sparse image, version: 1.0, Total of 491520 4096-byte output blocks in 4854 input chunks.

第二个是生成的ext4再转化后的:

file sysparse.rimg

sys.rimg: Android sparse image, version: 1.0, Total of 491520 4096-byte output blocks in 10396 input chunks.

会发现 这两个的blocks会不一样.

最后使用rimg2sdat.py github地址:https://github.com/xpirt/img2sdat  :

./img2sdat.py sysparse.rimg ./ 4

这样,会在当前目录下生成2个文件:system.new.dat system.transfer.list。自己再创建一个空的system.patch.dat即可。

最近筹备的一些东西和遇到的问题。

最近有部分rom开发者将rom打包成了一种特殊的格式,实质肯定是ext的img,但是无法挂载,也没有多余的分区,更无法转化,正在寻找解决办法

同时也准备开发一个rom推广的精简工具,以后我会更倾向于直接刷完三方再一键精简。不太想折腾包了,打包解包太慢,测试时间也长,使用app,会更0基础更方便一些。

测试环境:

ubuntu 16.04 64bit

各种问题解决来自:

Android5.0以上使用raw ext4fs image制作system.new.dat

解压和打包安卓DAT文件

Android 5.0 system.new.dat解包工具及方法

[android]system.img文件的打包和解包

以下包中有一个img2simg工具没有,Ubuntu下可以直接安装工具包

 sudo apt install android-tools-fsutils

已测试的所有最新的工具 linux使用自行百度学习

DatImg工具包.7z

声明:TIL|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA[ZH]协议进行授权

转载:转载请注明原文链接 - [ROM开发]解包打包ROM详细教程 2017.9.8更新安卓7.0


Life is very interesting. In the end, some of your greatest pains become your greatest strengths.