Android定製ROM,內嵌su和xposed

androidwing發表於2017-12-15

本文同步自wing的地方酒館

從Windows 98時代起,我就熱衷於裝系統。平均三天對著家裡的桌上型電腦重灌,重灌,再重灌。樂此不疲,後來到XP時代,有了GHOST,裝的更瘋狂了。現在到Android,仍然是刷刷刷,一直有個想法就是自己搞個ROM玩,於是這幾天鼓搗了一下把su和xposed內嵌進去了。感謝大佬圖樂的指點和討論。

這裡選擇的是ota包,因為ota包可以修改updater-script來實現在recovery裡面進行一些操作。

官方ROM下載地址為:developers.google.com/android/ota

將他解壓,可以看到一些boot.img映象之類的,這裡我們關心META-INF資料夾,

Android定製ROM,內嵌su和xposed
裡面的updater-script就是recovery刷入zip包時候的一些指令碼拉,從這裡修改一下指令碼就可以做一些我們想做的事情。

精簡&預裝系統APP

這裡我們想要實現精簡系統APP,其實只需要將system掛載,並且刪除/system/app下資料夾即可。並且想要增加系統APP,只需要建立對應檔案即可。 在scripet結尾新增以下程式碼


ui_print("mounting system");
mount("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system", "/system");

ui_print("remove apps");
run_program("/sbin/busybox", "rm", "-rf", "/system/app/YouTube");

複製程式碼

以上程式碼展示的是刪除預裝app的過程,那麼預裝呢?

Android定製ROM,內嵌su和xposed

我們在zip包目錄建立一個同樣的system資料夾,裡面放app資料夾,在用指令碼把system提取到/system即可:

ui_print("set system apps");
package_extract_dir("system","/system");
複製程式碼

嵌入su

解壓su.zip發現幾乎和刷機包的原理一樣,並且刷入su的過程其實是用指令碼解壓boot.img 修改檔案值 再重新合併boot.img 在進行刷入。 所以我們只要在指令碼里執行刷入su.zip的操作即可執行:

ui_print("====================>now start root");
package_extract_dir("ext/su", "/tmp/supersu");
run_program("/sbin/busybox", "unzip", "/tmp/supersu/su.zip", "META-INF/com/google/android/*", "-d", "/tmp/supersu");
run_program("/sbin/busybox", "sh", "/tmp/supersu/META-INF/com/google/android/update-binary", "dummy", "1", "/tmp/supersu/su.zip");

複製程式碼

當然,這個時候zip目錄要有對應的zip包。

嵌入xposed

這個是我卡了很久的地方,因為並不知道run_program的pwd,所以後來使用絕對路徑並且用另一個指令碼繞了一下:

run_program("/sbin/busybox", "chmod","777","/system/flash-script.sh");
run_program("/sbin/busybox", "chmod","777","/system/install_xposed.sh");

ui_print("run install_xposed.sh");
run_program("/system/install_xposed.sh");
複製程式碼

其實xposed的刷入,就是把system的一些檔案通過flash-script.sh進行替換連結等操作,所以我們只需把xposed包的system資料夾換一下位置,然後執行flash-script.sh即可:

Android定製ROM,內嵌su和xposed

install_xopsed.sh:

#!/sbin/sh
cd /system/ && /system/flash-script.sh

複製程式碼

這裡需要注意的是上面的註釋,這個坑了我好幾個小時,因為缺失註釋導致無法使用run_program()方法執行。

修改完畢以後,將zip包打包即可

zip -r rom.zip ./
複製程式碼

這裡值得注意的一點是 必須在目錄內部打包,在外部會多一層目錄,導致無法找到updater-script,這裡也坑了我一個多小時。。

參考資料bbs.gfan.com/android-832…

相關文章