之前刚用手机的时候,常常能够在玩机论坛上看到不少发ROM包的帖子,譬如什么大深度定制ROM,什么大深度深度精简纯净版ROM...相信不少喜欢搞机的都有见过这类帖子。后来本身不满每次刷机后都要手动设置一大堆东西,遂按照论坛上的教程改了Defy+的cm11的ROM,集成了绿色守护,默认容许安装未知来源的应用,默认电池百分号显示等等。时隔4年,又玩起了ROM包定制,感慨颇多python
假设有一个名为update.zip的ROM包,咱们要在Ubuntu下对它进行定制。首先把system.transfer.list
和system.new.dat.br
(有些旧版的系统的镜像多是system.new.dat)从update.zip解压出来,转成system.img(原始镜像格式),修改完后又按步骤打包回原来的格式。本文只写了system分区的定制方法,可是对于其余分区也是相似的,都要转成原始镜像格式后才能对它修改。若是使用file system.img
命令来查看system.img文件信息,会获得相似下面的信息:android
system.img: Linux rev 1.0 ext4 filesystem data, UUID=da594c53-9beb-f85c-85c5-cedf76546f7a, volume name "system" (extents) (large files)
brotli -d system.new.dat.br
git
注:若是镜像就是system.new.dat格式,就跳过这步github
git clone https://github.com/xpirt/sdat2img cd sdat2img python sdat2img.py system.transfer.list system.new.dat system.img
sudo mkdir -p /mnt/system sudo mount -o loop system.img /mnt/system
挂载后能够经过df -h
来查看挂载点/mnt/system
剩余空间有多少,若是没有剩余,就要对它进行扩容,下面的例子是给它增长128M的空间,扩容以前要先取消挂载app
dd if=/dev/zero bs=1M count=128 >> system.img e2fsck -f system.img resize2fs system.img
如今,能够在/mnt/system目录下根据本身的需求增删文件了oop
增删文件须要注意:spa
打包其实就是解包的逆过程unix
sudo make_ext4fs -T 0 -S file_contexts -l 1024M -a system system_new.img /mnt/system
df -h
命令查看挂载点/mnt/system
的总大小,而后取整数(512M,1024M,2048M...),好比查得挂载点空间大小是992M,你就得写1024M注: file_contexts能够去这里的private目录获取,根据系统版本选择分支(Android7.0对应的是cm14.0分支,Android7.1对应的是cm14.1分支,Android8.0对应lineage-15.0分支,以此类推),下载后也能够根据本身的需求定制file_contextscode
成功后会在当前目录下生成system_new.img。若是发生错误,根据错误进行调整参数,直到没有错误提示为止。blog
sudo umount /mnt/system
转换以前能够对以前解压出来的文件进行备份:
mv system.transfer.list system.transfer.list.bak mv system.new.dat system.new.dat.bak
开始转换
git clone https://github.com/jazchen/rimg2sdat cd rimg2sdat python rimg2sdat.py system_new.img
成功后会在当前目录下生成system.transfer.list和system.new.dat
brotli -0 system.new.dat
注:若是开始解压出来的镜像就是system.new.dat格式,就跳过这步
zip update.zip <system.new.dat.br或者system.new.dat> system.transfer.list
在有些刷机包里,它里面包含的system.img镜像是sparse image
格式的,若是用file命令查看它的信息,显示以下:
system.img: Android sparse image, version: 1.0, Total of 655360 4096-byte output blocks in 6009 input chunks.
对于这种格式的镜像,若是想把它挂载和修改,就要转成咱们上面提到的raw image(原始镜像)格式,命令以下:
simg2img <sparse_image_files> <raw_image_file>
修改完成后,取消挂载,再使用下面的命令将raw image
转成sparse image
:
img2simg <raw_image_file> <sparse_image_file> [<block_size>]
相对于修改Android源码的方式,直接修改镜像的方法对PC配置要求低不少。若是咱们只想增长一些现有的模块和删除没必要要的模块,这是很好的方式。并且对于一些手机厂商,他们没有提供Android源码,咱们就只能用直接修改镜像的方式来定制咱们的ROM。修改ROM的方法是灵活的,总结下来就是,看见一个镜像,能够根据后缀名和file命令确认它的格式,看状况将它转成原始镜像格式并挂载,就能够修改了,修改后又转回它原来的格式,最后替换刷机包中原有的镜像