之前剛用手機的時候,常常能夠在玩機論壇上看到不少發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命令確認它的格式,看狀況將它轉成原始鏡像格式並掛載,就能夠修改了,修改後又轉回它原來的格式,最後替換刷機包中原有的鏡像