Android定制ROM,内嵌su和xposed

4,793 阅读2分钟

本文同步自wing的地方酒馆

从Windows 98时代起,我就热衷于装系统。平均三天对着家里的台式机重装,重装,再重装。乐此不疲,后来到XP时代,有了GHOST,装的更疯狂了。现在到Android,仍然是刷刷刷,一直有个想法就是自己搞个ROM玩,于是这几天鼓捣了一下把su和xposed内嵌进去了。感谢大佬图乐的指点和讨论。

这里选择的是ota包,因为ota包可以修改updater-script来实现在recovery里面进行一些操作。

官方ROM下载地址为:developers.google.com/android/ota

将他解压,可以看到一些boot.img镜像之类的,这里我们关心META-INF文件夹,

里面的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的过程,那么预装呢?

我们在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即可:

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…