今天在酷安上看到一个叫 DualBootPatcherAndroid 的软件,通过在root下对rom进行修改并安装之后就可以实现多系统共存和开机引导。这就很有趣了,我们知道一般Android机的Bootloader都是被OEM处理过的,并且一般还会加上锁,而且在Andorid上仅通过Linux层面的系统修改肯定是无法触及到这个部分的,那所谓的多系统引导是怎么完成的呢。在github上找了一下,这个作者是一个国人@github/chenxiaolong,并且已经把整个套件完全开源【这个是最开始用于小米上的多系统解决方案?】,经过对公布的代码的简要分析(其实只看了二十分钟,可能有错),得出了以下结论。

0x00: 如何实现引导?
刚刚说到bootloader我们肯定是无法修改的,但是经常刷机的人都经常接触到的一个具有系统最高权限的系统部件是什么,All right,就是可以突破权限死锁将SU刷入系统中的Recovery。DB组件中包含了一个叫做MBToolUI的子项目,这个部分是在开机时选择引导哪个系统的一个界面(讲道理怎么看界面都是TWRP的),打开文件夹一看还是无比熟悉,这就是一个最小化的TWRP。使用了TWRP的主题系统并且定制了其中的reboot功能,为什么要说到这个reboot功能呢,一会就知道了。

0x01: 开始引导!
刚刚说道,MBToolUI只处理了recovery的reboot方法,引入了一些额外的参数设置,那是怎么完成系统引导的呢?非常简单,熟悉Linux的人都知道,系统中存在一个叫做fstab的东西,对关键就是在这里,挂载表!在rec进入的时候,挂载根目录,然后对/data /cache /storage/0 这几个目录下的multiboot子目录进行扫描寻找安装的系统,再通过选择修改到处fstab替换原有系统的fstab 之后直接重启,系统就会按照新的分区挂载表将新系统的部分挂载到应有的根目录,system等目录。

0x02: rom修改?
那这样的话只需要对rom直接进行安装就好了啊,为什么还要有patch和重打包这一步呢,在patch的时候进行了几个步骤,解压,更新update-binary,压包,签名。这里我觉得作者应该是觉得直接把按照rec的方式解包到data等分区比较麻烦,不如直接替换掉update-binary将这一步交给现成的组件去做(比如recovery)。在update-binary中需要添加的也不多,就是把所有根目录全部修改成 /data/multiboot/slot-android 这样的路径,然后交给recovery去执行就好了。所以后面还要追加一个安装过程。也就是把原来要安装在根目录下各个挂载点的内容都塞到那个路径,然后分区表直接引导新分区。

0x03: Other
上面讲的那些都是抛开技术细节实现说的技术原理,具体实现上大概花了10000行代码左右的C艹代码,算是一个比较优质的工程了,下次有空的话对其中一些细节的代码做一些深入的分析吧。


工程Github地址


发表评论

电子邮件地址不会被公开。