以前剛用手機(jī)的時(shí)候当凡,經(jīng)成胶Γ可以在玩機(jī)論壇上看到很多發(fā)ROM包的帖子,譬如什么大深度定制ROM沿量,什么大深度深度精簡(jiǎn)純凈版ROM...相信很多喜歡搞機(jī)的都有見過這類帖子浪慌。后來自己不滿每次刷機(jī)后都要手動(dòng)設(shè)置一大堆東西,遂按照論壇上的教程改了Defy+的cm11的ROM朴则,集成了綠色守護(hù)权纤,默認(rèn)允許安裝未知來源的應(yīng)用,默認(rèn)電池百分號(hào)顯示等等乌妒。時(shí)隔4年汹想,又玩起了ROM包定制,感慨頗多
1. 解包
假設(shè)有一個(gè)名為update.zip的ROM包撤蚊,我們要在Ubuntu下對(duì)它進(jìn)行定制欧宜。首先把system.transfer.list
和system.new.dat.br
(有些舊版的系統(tǒng)的鏡像可能是system.new.dat)從update.zip解壓出來,轉(zhuǎn)成system.img(原始鏡像格式)拴魄,修改完后又按步驟打包回原來的格式冗茸。本文只寫了system分區(qū)的定制方法,但是對(duì)于其他分區(qū)也是類似的匹中,都要轉(zhuǎn)成原始鏡像格式后才能對(duì)它修改夏漱。如果使用file system.img
命令來查看system.img文件信息,會(huì)得到類似下面的信息:
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轉(zhuǎn)換為system.new.dat
brotli -d system.new.dat.br
注:如果鏡像就是system.new.dat格式顶捷,就跳過這步
1.2 system.new.dat轉(zhuǎn)成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 擴(kuò)容(可選)
掛載后可以通過df -h
來查看掛載點(diǎn)/mnt/system
剩余空間有多少挂绰,如果沒有剩余,就要對(duì)它進(jìn)行擴(kuò)容,下面的例子是給它增加128M的空間,擴(kuò)容之前要先取消掛載
dd if=/dev/zero bs=1M count=128 >> system.img
e2fsck -f system.img
resize2fs system.img
2. 修改
現(xiàn)在郭宝,可以在/mnt/system目錄下根據(jù)自己的需求增刪文件了
增刪文件需要注意:
- 對(duì)/mnt/system進(jìn)行寫操作需要root權(quán)限
- 如果需要往/system/app目錄或者/system/priv-app目錄下加入自己的apk,需要注意除了把a(bǔ)pk復(fù)制進(jìn)去外,還要把a(bǔ)pk里面的so文件復(fù)制進(jìn)去(如果有的話)践付,復(fù)制進(jìn)去時(shí)注意apk和so文件的路徑,可以參考其他系統(tǒng)App是怎么存放的
- 對(duì)于非Apk文件缺厉,復(fù)制進(jìn)去后永高,還要使用chmod,chown等命令給它們合理的權(quán)限才能生效
3. 打包
打包其實(shí)就是解包的逆過程
3.1 生成system.img
sudo make_ext4fs -T 0 -S file_contexts -l 1024M -a system system_new.img /mnt/system
- -T 代表對(duì)鏡像中的unix文件時(shí)間戳進(jìn)行設(shè)置,這里設(shè)置為0提针,表示1970-1-1
- -S 指定file_contexts
- -l 表示目標(biāo)鏡像的大小命爬。如果不懂得寫多少可以使用
df -h
命令查看掛載點(diǎn)/mnt/system
的總大小,然后取整數(shù)(512M,1024M,2048M...)辐脖,比如查得掛載點(diǎn)空間大小是992M,你就得寫1024M - -a 指定目標(biāo)img文件在Android中的掛載點(diǎn)
- system_new.img 表示生成的鏡像
- /mnt/system/ 表示源目錄
注: file_contexts可以去這里獲取饲宛,根據(jù)系統(tǒng)版本選擇分支(Android7.0對(duì)應(yīng)的是cm14.0分支,Android7.1對(duì)應(yīng)的是cm14.1分支嗜价,Android8.0對(duì)應(yīng)lineage-15.0分支,以此類推)艇抠,下載后也可以根據(jù)自己的需求定制file_contexts
成功后會(huì)在當(dāng)前目錄下生成system_new.img幕庐。如果發(fā)生錯(cuò)誤,根據(jù)錯(cuò)誤進(jìn)行調(diào)整參數(shù)练链,直到?jīng)]有錯(cuò)誤提示為止翔脱。
3.2 卸載system
sudo umount /mnt/system
3.3 把system.img轉(zhuǎn)成system.new.dat
轉(zhuǎn)換之前可以對(duì)之前解壓出來的文件進(jìn)行備份:
mv system.transfer.list system.transfer.list.bak
mv system.new.dat system.new.dat.bak
開始轉(zhuǎn)換
git clone https://github.com/jazchen/rimg2sdat
cd rimg2sdat
python rimg2sdat.py system_new.img
成功后會(huì)在當(dāng)前目錄下生成system.transfer.list和system.new.dat
3.4 system.new.dat轉(zhuǎn)成system.new.dat.br
brotli -0 system.new.dat
注:如果開始解壓出來的鏡像就是system.new.dat格式奴拦,就跳過這步
3.5 更新文件到刷機(jī)包
zip update.zip <system.new.dat.br或者system.new.dat> system.transfer.list
4. 擴(kuò)展知識(shí)
在有些刷機(jī)包里媒鼓,它里面包含的system.img鏡像是sparse image
格式的,如果用file命令查看它的信息错妖,顯示如下:
system.img: Android sparse image, version: 1.0, Total of 655360 4096-byte output blocks in 6009 input chunks.
對(duì)于這種格式的鏡像绿鸣,如果想把它掛載和修改,就要轉(zhuǎn)成我們上面提到的raw image(原始鏡像)格式暂氯,命令如下:
simg2img <sparse_image_files> <raw_image_file>
修改完成后潮模,取消掛載,再使用下面的命令將raw image
轉(zhuǎn)成sparse image
:
img2simg <raw_image_file> <sparse_image_file> [<block_size>]
5. 總結(jié)
相對(duì)于修改Android源碼的方式痴施,直接修改鏡像的方法對(duì)PC配置要求低很多擎厢。如果我們只想增加一些現(xiàn)有的模塊和刪除不必要的模塊,這是很好的方式辣吃。而且對(duì)于一些手機(jī)廠商动遭,他們沒有提供Android源碼,我們就只能用直接修改鏡像的方式來定制我們的ROM神得。修改ROM的方法是靈活的厘惦,總結(jié)下來就是,看見一個(gè)鏡像哩簿,可以根據(jù)后綴名和file命令確認(rèn)它的格式宵蕉,看情況將它轉(zhuǎn)成原始鏡像格式并掛載,就可以修改了节榜,修改后又轉(zhuǎn)回它原來的格式羡玛,最后替換刷機(jī)包中原有的鏡像