Android ROM包定製(解包,增刪模塊,打包)

之前剛用手機的時候,常常能夠在玩機論壇上看到不少發ROM包的帖子,譬如什麼大深度定製ROM,什麼大深度深度精簡純淨版ROM...相信不少喜歡搞機的都有見過這類帖子。後來本身不滿每次刷機後都要手動設置一大堆東西,遂按照論壇上的教程改了Defy+的cm11的ROM,集成了綠色守護,默認容許安裝未知來源的應用,默認電池百分號顯示等等。時隔4年,又玩起了ROM包定製,感慨頗多python

1. 解包

假設有一個名爲update.zip的ROM包,咱們要在Ubuntu下對它進行定製。首先把system.transfer.listsystem.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)

1.1 system.new.dat.br轉換爲system.new.dat

brotli -d system.new.dat.brgit

注:若是鏡像就是system.new.dat格式,就跳過這步github

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 system.img

1.3 掛載system.img

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

1.4 擴容(可選)

掛載後能夠經過df -h來查看掛載點/mnt/system剩餘空間有多少,若是沒有剩餘,就要對它進行擴容,下面的例子是給它增長128M的空間,擴容以前要先取消掛載app

dd if=/dev/zero bs=1M count=128 >> system.img
e2fsck -f system.img
resize2fs system.img

2. 修改

如今,能夠在/mnt/system目錄下根據本身的需求增刪文件了oop

system_files

增刪文件須要注意:spa

  1. 對/mnt/system進行寫操做須要root權限
  2. 若是須要往/system/app目錄或者/system/priv-app目錄下加入本身的apk,須要注意除了把apk複製進去外,還要把apk裏面的so文件複製進去(若是有的話),複製進去時注意apk和so文件的路徑,能夠參考其餘系統App是怎麼存放的
  3. 對於非Apk文件,複製進去後,還要使用chmod,chown等命令給它們合理的權限才能生效

3. 打包

打包其實就是解包的逆過程unix

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能夠去這裏的private目錄獲取,根據系統版本選擇分支(Android7.0對應的是cm14.0分支,Android7.1對應的是cm14.1分支,Android8.0對應lineage-15.0分支,以此類推),下載後也能夠根據本身的需求定製file_contextscode

成功後會在當前目錄下生成system_new.img。若是發生錯誤,根據錯誤進行調整參數,直到沒有錯誤提示爲止。blog

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命令確認它的格式,看狀況將它轉成原始鏡像格式並掛載,就能夠修改了,修改後又轉回它原來的格式,最後替換刷機包中原有的鏡像

相關文章
相關標籤/搜索