Android定制ROM,内嵌su和xposed
本文同步自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…