本文同步自wing的地方酒館php
從Windows 98時代起,我就熱衷於裝系統。平均三天對着家裏的臺式機重裝,重裝,再重裝。樂此不疲,後來到XP時代,有了GHOST,裝的更瘋狂了。如今到Android,仍然是刷刷刷,一直有個想法就是本身搞個ROM玩,因而這幾天鼓搗了一下把su和xposed內嵌進去了。感謝大佬圖樂的指點和討論。html
這裏選擇的是ota包,由於ota包能夠修改updater-script來實如今recovery裏面進行一些操做。android
官方ROM下載地址爲:developers.google.com/android/otabash
將他解壓,能夠看到一些boot.img鏡像之類的,這裏咱們關心META-INF文件夾,app
這裏咱們想要實現精簡系統APP,其實只須要將system掛載,而且刪除/system/app下文件夾便可。而且想要增長系統APP,只須要建立對應文件便可。 在scripet結尾添加如下代碼ui
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的過程,那麼預裝呢?google
咱們在zip包目錄建立一個一樣的system文件夾,裏面放app文件夾,在用腳本把system提取到/system便可:spa
ui_print("set system apps");
package_extract_dir("system","/system");
複製代碼
解壓su.zip發現幾乎和刷機包的原理同樣,而且刷入su的過程實際上是用腳本解壓boot.img 修改文件值 再從新合併boot.img 在進行刷入。 因此咱們只要在腳本里執行刷入su.zip的操做便可執行:.net
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包。code
這個是我卡了好久的地方,由於並不知道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便可:
install_xopsed.sh:
#!/sbin/sh
cd /system/ && /system/flash-script.sh
複製代碼
這裏須要注意的是上面的註釋,這個坑了我好幾個小時,由於缺失註釋致使沒法使用run_program()方法運行。
修改完畢之後,將zip包打包便可
zip -r rom.zip ./
複製代碼
這裏值得注意的一點是 必須在目錄內部打包,在外部會多一層目錄,致使沒法找到updater-script,這裏也坑了我一個多小時。。