准备工具

  • Brotli压缩解压工具

    Brotli是一种全新的数据格式,可以提供比Zopfli20-26% 的压缩比。据谷歌研究,Brotli压缩速度同zlibDeflate实现大致相同,而在Canterbury语料库上的压缩密度比LZMAbzip2略大。

    安装:sudo apt-get install brotli -y

  • sdat2img IMG转换工具,Python编写的脚本 https://github.com/xpirt/sdat2img

  • Python3.6

  • make_ext4fs

  • rimg2sdat https://github.com/jazchen/rimg2sdat

  • zip

解包

假设有一个名为update.zip的ROM包,我们要在Ubuntu下对它进行定制。

核心步骤:

首先把system.transfer.list和system.new.dat.br(有些旧版的系统的镜像可能是system.new.dat)从update.zip解压出来,转成system.img(原始镜像格式),修改完后又按步骤打包回原来的格式。

System分区的定制

本文只写了system分区的定制方法,但是对于其他分区也是类似的,都要转成原始镜像格式后才能对它修改。如果使用file system.img命令来查看system.img文件信息,会得到类似下面的信息:

1
2
3


system.img: Linux rev 1.0 ext4 filesystem data, UUID=da594c53-9beb-f85c-85c5-cedf76546f7a, volume name "system" (extents) (large files)

system.new.dat.br转换为system.new.dat

1
2
3


brotli -d system.new.dat.br

注:如果镜像就是system.new.dat格式,就跳过这步

system.new.dat转成system.img

1
2
3
4
5
6
7
8
9


git clone https://github.com/xpirt/sdat2img


cd sdat2img


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

挂载system.img

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15


sudo mkdir -p /mnt/system





sudo mount -o loop system.img /mnt/system





cd /mnt/system

扩容(可选)

挂载后可以通过df -h来查看挂载点/mnt/system剩余空间有多少,如果没有剩余,就要对它进行扩容,下面的例子是给它增加128M的空间,扩容之前要先取消挂载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15


dd if=/dev/zero bs=1M count=128 >> system.img





e2fsck -f system.img





resize2fs system.img

修改

现在,可以在/mnt/system目录下根据自己的需求增删文件了。增加文件后,使用chmod,chown等命令来修改它们的权限

打包

打包其实就是解包的逆过程

生成system.img

1
2
3


sudo make_ext4fs -T 0 -S file_contexts -l 2048M -a system system_new.img /mnt/system

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

-S 指定file_contexts

-l 表示目标镜像的大小。如果不懂得写多少可以使用df -h命令查看挂载点/mnt/system的总大小,然后取整数(512M,1024M,2048M…),比如查得挂载点空间大小是992M,你就得写1024M

-a 指定目标img文件在Android中的挂载点

system_new.img 表示生成的镜像

/mnt/system/ 表示源目录

注: file_contexts可以去这里,根据系统版本选择分支(Android7.0对应的是cm14.0分支,Android7.1对应的是cm14.1分支,Android8.0对应lineage-15.0分支,以此类推)下载,下载后也可以根据自己的需求定制file_contexts

成功后会在当前目录下生成system_new.img。如果发生错误,根据错误进行调整参数,直到没有错误提示为止。

卸载system

1
2
3


sudo umount /mnt/system

把system.img转成system.new.dat

转换之前可以对之前解压出来的文件进行备份:

1
2
3
4
5
6
7
8
9


mv system.transfer.list system.transfer.list.bak





mv system.new.dat system.new.dat.bak

开始转换

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15


git clone https://github.com/jazchen/rimg2sdat





cd rimg2sdat





python rimg2sdat.py system_new.img

成功后会在当前目录下生成system.transfer.list和system.new.dat

system.new.dat转成system.new.dat.br

1
2
3


brotli -0 system.new.dat

注:如果开始解压出来的镜像就是system.new.dat格式,就跳过这步

更新文件到刷机包

1
2
3


zip update.zip system.transfer.list