Android Custom

2018/09/02

Tags: android

我们给用户的设备,有 android pad 和 pc。pc 系统我之前基于 porteus 定制了一个,勉强可以用。apad 的系统一直没搞好。

Android 系统必须要解锁之后才可以定制系统,否则没有 root 权限,system 分区的数据不能修改。

前三个分区都可以定制。首先需要解锁 bootloader,这个各个定制版都可能有区别,比如华为我记得还需要去他们网站获取一个解锁码,获取的时候会提示你解锁之后就不给保了。原生的 android 都是去开发者选项里面打开,然后在启动的时候进 bootloader,执行 fastboot oem unlock-go 。解锁的时候会自动 reset 系统,注意先备份数据。

解锁之后,就可以刷自己的 recovery 了。刷之前建议先备份一下 boot recovery system 分区,以方便自己回头可以刷回来。我用的是 twrp,其它的好像现在也么看到。这个得找和你的手机匹配的才行。具体方法是执行 fastboot boot twrpxxxxx.img 临时使用 twrp 启动,然后用通过 adb shell 登录 shell,之后用 dd if=/dev/block/mmcblk0pXX of=/sdcard/xxx.img 来备份,之后用 adb pull /sdcard/xxx.img 下载到本地。具体各个分区的那个 XX 是什么,可以用 fdisk -l 看。

这里有一个需要注意的是,我发现我这使用临时启动到 twrp 的方式还是不能修改 system 分区,必须是把 twrp 刷入 recovery 之后才可以。就是这个导致我一直没有搞好 apad 的系统,我开始一直是用临时启动到 recovery 的方式来做的,对 system 做修改就是死机。

现在比较新的系统都有一个 dm-verify ,想修改 system 分区就需要关闭这个,否则任何修改都会导致系统不能启动。我在 xda 找到一个 可以直接在 recovery 里面通过 sideload 刷就可以。

关闭 dm-verify 之后就可以修改系统了。我还有一个需求是想系统启动之后,通过 iptables 对系统使用的网络做一些限制。想要在系统启动之后做一些事情,比较简单的就是修改 system 分区的那些 xxx.rc 加入自己的东西。我试了之后发现虽然程序可以执行,但是这种方式的程序,并不能直接操作 iptables 命令(执行不报错,但是无实际效果)。查了说大概是 kernel 级别的限制,这样难不成就去定制 kernel 了?

Android 系统的 root 实际应该就是对系统 kernel 打了一个补丁,放了一个后门,允许通过 su 命令来获取 root 权限,这里获取的 root 权限可是货真价实的,可以执行 iptables 命令。

Magisk 可以给系统 root。recovery 里面通过 sideload 刷入之后,系统会多出来一个 app,有程序想用 su 的话,这个 app 会弹一个提示问是不是允许。magisk 应该是给 kernel 打了补丁,关闭了 dm-verify(所以用 magisk 的话,就可以不用上面那个了),然后启动的时候,会 mount 一个 su.img 提供 su 命令,会启动一个 su 的 daemon。这个可以通过看 ramdisk 里面的内容可以看到。magisk 还会在你的 /data 分区装一个 app,一起配合使用。但是要注意一点,我们 wipe 系统之后,这个 app 也会被删除。但是前面说的那些 su.img 之类都是在 boot 分区的,那些都还有,一个没有 app 配合的 su 也可以用,就是所有程序都直接使用,没有限制了。所以如果是你自己用,那最最好是和 boot 一起刷,或者就是自己安装一个 app。

对于 system 的修改,拿到 root 权限就可以了。但是对于 boot 分区,只能拿到一个 boot.img,想要修改,还需要使用一些工具把里面的内容解出来,以及之后再打包。我找到一个工具

android 系统启动的时候会读取一些 xxx.rc,这些 rc 类似 linux 下面那些,但是不像 linux 那些都是脚本,是有一个自己的格式的内容。

on property:sys.boot_completed=1
    start wd-post-boot

service wd-post-boot /system/bin/sh /wd.post_boot.sh
    class late_start
    user root
    disabled
    oneshot

比如我上面这个,定义了一个 service wd-post-boot ,然后让他在 sys.boot_completed 这个 prop 值为 1 的时候执行一次。还有很多其它的方法,可以找 android 的文档看,我说的不能执行 iptables 就是这里的脚本里面不能执行。

Comments