以前剛用手機的時候,經常可以在玩機論壇上看到很多發ROM包的帖子,譬如什么大深度定制ROM,什么大深度深度精簡純凈版ROM...相信很多喜歡搞機的都有見過這類帖子。后來自己不滿每次刷機后都要手動設置一大堆東西,遂按照論壇上的教程改了Defy+的cm11的ROM,集成了綠色守護,默認允許安裝未知來源的應用,默認電池百分號顯示等等。時隔4年,又玩起了ROM包定制,感慨頗多
1. 解包
假設有一個名為update.zip的ROM包,我們要在Ubuntu下對它進行定制。首先把system.transfer.list
和system.new.dat.br
(有些舊版的系統的鏡像可能是system.new.dat)從update.zip解壓出來,轉成system.img(原始鏡像格式),修改完后又按步驟打包回原來的格式。本文只寫了system分區的定制方法,但是對於其他分區也是類似的,都要轉成原始鏡像格式后才能對它修改。如果使用file system.img
命令來查看system.img文件信息,會得到類似下面的信息:
system.img: Linux rev 1.0 ext4 filesystem data, UUID=da594c53-9beb-f85c-85c5-cedf76546f7a, volume name "system" (extents) (large files)
1.1 system.new.dat.br轉換為system.new.dat
brotli -d system.new.dat.br
注:如果鏡像就是system.new.dat格式,就跳過這步
1.2 system.new.dat轉成system.img
git clone https://github.com/xpirt/sdat2img
cd sdat2img
python sdat2img.py ../system.transfer.list ../system.new.dat
1.3 掛載system.img
sudo mkdir -p /mnt/system
sudo mount -o loop system.img /mnt/system
1.4 擴容(可選)
掛載后可以通過df -h
來查看掛載點/mnt/system
剩余空間有多少,如果沒有剩余,就要對它進行擴容,下面的例子是給它增加128M的空間,擴容之前要先取消掛載
dd if=/dev/zero bs=1M count=128 >> system.img
e2fsck -f system.img
resize2fs system.img
2. 修改
現在,可以在/mnt/system目錄下根據自己的需求增刪文件了
增刪文件需要注意:
- 對/mnt/system進行寫操作需要root權限
- 如果需要往/system/app目錄或者/system/priv-app目錄下加入自己的apk,需要注意除了把apk復制進去外,還要把apk里面的so文件復制進去(如果有的話),復制進去時注意apk和so文件的路徑,可以參考其他系統App是怎么存放的
- 對於非Apk文件,復制進去后,還要使用chmod,chown等命令給它們合理的權限才能生效
3. 打包
打包其實就是解包的逆過程
3.1 生成system.img
sudo make_ext4fs -T 0 -S file_contexts -l 1024M -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。如果發生錯誤,根據錯誤進行調整參數,直到沒有錯誤提示為止。
3.2 卸載system
sudo umount /mnt/system
3.3 把system.img轉成system.new.dat
轉換之前可以對之前解壓出來的文件進行備份:
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
3.4 system.new.dat轉成system.new.dat.br
brotli -0 system.new.dat
注:如果開始解壓出來的鏡像就是system.new.dat格式,就跳過這步
3.5 更新文件到刷機包
zip update.zip <system.new.dat.br或者system.new.dat> system.transfer.list
4. 擴展知識
在有些刷機包里,它里面包含的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>]
5. 總結
相對於修改Android源碼的方式,直接修改鏡像的方法對PC配置要求低很多。如果我們只想增加一些現有的模塊和刪除不必要的模塊,這是很好的方式。而且對於一些手機廠商,他們沒有提供Android源碼,我們就只能用直接修改鏡像的方式來定制我們的ROM。修改ROM的方法是靈活的,總結下來就是,看見一個鏡像,可以根據后綴名和file命令確認它的格式,看情況將它轉成原始鏡像格式並掛載,就可以修改了,修改后又轉回它原來的格式,最后替換刷機包中原有的鏡像