Android 为智能手机的普及立下了汗马功劳,可是开源所导致的「碎片化」问题,一直是 Google 心中难以掩饰的痛。为了改变这一现状,Google 进行了许多尝试,例如在 Android 7.0 引入的「A/B(无缝)系统更新」,Android 8.0 时推出的「Project Treble」,都是为了铺平无障碍更新系统的道路,减轻更新失败导致设备故障的风险,以便厂商可以更轻松地推送系统更新。

而在 Android 11 版本,Google 使用了名为「virtual A/B」的新分区,并将其率先使用在 Google Pixel 5 上。「virtual A/B」更新系统的方法与「A/B」类似,核心功能也相同。在系统进行 OTA 更新时,如果更新失败会自动回滚到上一个系统,成功开机进入之后才会将新数据写入到系统中。且系统更新可在待机状态下完成,无需重启等待新数据写入,可谓是极大地改善了更新系统时的用户体验。只是「A/B」需要准备两个相同的分区,会占用更多的存储空间,而「virtual A/B」删除了「cache」和「recovery」分区,「system」分区只保留一个,以解决上述空间占用问题。1

小米 11 也是使用的「virtual A/B」,可这对我来说并不是什么好消息。因为「virtual A/B」删除了「recovery」分区,没有了「recovery」分区就不能刷入第三方「recovery」。因此在 TWRP 官方解决为这类新分区方式刷入第三方 recovery 之前,我只能使用其他方法来为小米 11 刷机了。

不过我这也算不上啥刷机,只是安装一个 Magisk 而已。这篇文章也会等到能刷上 TWRP 的时候,再继续更新。

刷机有风险,搞机需谨慎,请准备好备用机,做好变砖的心理准备。在确定当地有小米之家可进行售后维修后,再进行刷机操作。

以下是刷机记录。

解锁

到手的手机还是出厂系统,先把系统更新到最新版本。我使用的是 MIUI 12.0.22.0 稳定版本,体验上还不赖。当然不想更新也没啥问题。

1. 启用开发者模式

刚到手的手机,先登录自己的小米账号,然后在设置中打开「开发者模式」。

MIUI 12 系统开启「开发者模式」的步骤是:设置 → 我的设备 → 全部参数,点按「MIUI 版本」七次,会有提示弹出「开发者模式已开启」。

设置「开发者模式」的入口在:设置 → 更多设置 → 开发者选项。勾选「OEM 解锁」、「USB 调试」。在「设备解锁状态」中,绑定账号与设备。

2. 下载解锁工具

前往「解锁小米手机」页面下载解锁工具。

3. 更新驱动

为了避免解锁或是刷机时出现各种不可预测的危险,先更新好驱动。把下载好的压缩包解压,点击miflash_unlock.exe打开解锁工具。

点击右上角设置。

在将手机连接到电脑前,一定要先在「开发者模式」里打开「USB 调试」,弹出类似「允许此电脑使用USB 调试」的字样,然后再点击「驱动检测」更新驱动。

4. 解锁

然后就可以解锁了。注意解锁会清除所有手机数据,所以不要急着往新手机里转移数据。解锁这个过程解锁工具会有提示,就跳过了。

不过一直有听说新手机解锁的话,需要绑定一段时间(大概是七天)的小米账号才行,但我手机一到手就解锁了……

解锁完后会自动重启,数据会被清空。

提取boot.img

目前刷机的目的仅是刷入 Magisk,Magisk 可以通过修补系统boot.img的方式刷入,毋需使用 TWRP 或是其他第三方 REC 工具刷入。

所以需要先提取当前系统的原始boot.img文件。

利用线刷包提取

小米社区中看看有没有手机当前系统版本的线刷包,下载下来,解压之后,就有boot.img,可以直接使用。只不过目前只有 MIUI 12 稳定版本的线刷包。

利用卡刷包(手机系统更新包)提取

小米社区还未提供当前使用版本的线刷包的话,也可以在手机系统更新中下载完整卡刷包。首先进入系统更新中点击下载完整更新包,下载开始后把后台全关闭,进入下载管理,手动继续下载,否则更新包会被自动解包更新到系统中去。

但是这类更新包是加密状态的,需要使用工具解密。

手机端

手机端的解密方法参考了 XDA 上的教程刷入打过 Magisk 补丁的boot.img还是需要用电脑),步骤如下:

  1. 下载 Termux(Play 商店 / 酷安
  2. 下载 payload_dumper(GitHub)并解压
  3. 解压下载系统更新包,将解压出来的payload.bin放入payload_dumper文件夹中
  4. 打开 Termux,执行命令
pkg install python -y
pip install --upgrade pip
apt update && apt upgrade -y
termux-setup-storage

执行到这一步会弹出提示,同意即可。


找到解压后的 payload_dumper 文件夹,长按该文件夹,点击更多 → 详情,复制该文件夹位置

比如我的 payload_dumper 文件夹位置是在/storage/emulated/0/payload_dumper,那么接下来在 Termux 的操作指令应该是

cd /storage/emulated/0/payload_dumper
pip install -r requirements.txt
python payload_dumper.py payload.bin

等待解包结束,就可以在payload_dumper/output文件夹中找到boot.img

PC端

PC端的刷入方法参考了酷安教程

  1. payload.bin解压出来
  2. 下载解密工具:传送门,并解压
  3. payload.bin放到payload_input文件夹中
  4. 运行payload_dumper.exe
  5. 由于只需要boot.img,所以不用等全程走完,看到boot.img解压出来就可以把程序关掉

刷入 Magisk

1. 安装 Magisk

下载 Magisk Manager(GitHub / 备份)安装并打开,可能会因为网络原因无法正常加载相关信息。


可以打开右上角设置,点击「更新通道」将其修改为自定义,然后在网上搜索「Magisk自定义通道」,找个能用的填入自定义通道中。可以使用我的:https://zui.moe/magisk/stable.json ,目前为稳定版23.0,不过不保证能持续更新。

设置之后应该就可以正常加载了。

2. 修补 boot.img

然后点击 Magisk 旁边的安装。


选择「选择并修补一个文件」。

找到刚才解密出来的boot.img并选中,点击开始。

打过 Magisk 补丁的boot.img放在/Download文件夹下。

3. 刷入 boot.img

将修补过后的magisk_patched_xxxxx.img复制到电脑,准备开始刷 Magisk,刷入方法参考了酷安教程。刷机需要使用到 adb 工具(传送门),注意解压。

在开机状态下,将手机连接至电脑。双击 adb 工具中的打开CMD命令行.bat

以下命令需要手机上开启「USB 调试」,命令的含义上图中都有说明,不再解释了。

adb devices

需要成功列出 adb 设备才行,失败的话检查驱动、数据线、电脑接口,一一排查。

adb reboot bootloader

重启到 fastboot 模式后,手机显示的是一只维修机器人的米兔。然后就可以刷入打过补丁的boot.img了。由于修补过后的magisk_patched_xxxxx.img名字每次都不一样,建议直接拖动,可以参考我之前做的动图。注意命令中的空格。

fastboot flash boot_a magisk_patched_xxxxx.img
fastboot flash boot_b magisk_patched_xxxxx.img

刷入成功后,输入fastboot reboot重启设备,没有意外的话就可以看到已经成功激活的 Magisk 了。

4. 后续系统更新

之后的更新系统,就不用像第一次这么繁琐地提取boot.img打补丁再刷入系统之中了。只是需要在更新新版本时,选择「下载完整更新包」。

然后等待更新包写入系统后,提示「重启完成更新」后,不要急着更新,这时候打开 Magisk,选择「安装到未使用的槽位(OTA 后)」,点击确定。


等待刷入完成。

重启系统,就更新完了。

或者,不用下载完整包也可以。在下载增量包前,先在magisk里点击「卸载Magisk」,选择「还原原厂镜像」。

然后再增量更新。更新完成后,不要重启,和上面一样,安装 Magisk,选择「安装到未使用的槽位(OTA 后)」,再重启系统。

刷入 TWRP

目前已有尝鲜版TWRP,可以在微博上查看发布信息。但并非开源(付费),且刷入方法相对麻烦些,加上第三方 ROM 不多,可以自己刷着玩玩,但没有必要一定得刷TWRP。

一些问题

1. SafetyNet 无法通过

刷了 Magisk 后,SafetyNet 检测就无法通过。无法通过的话,Google Play 保证机制就无法通过,有些游戏就下载不了。

解决方法是:使用下面这两个模块

  1. safetynet-fix
  2. XiaomiCTSPass

在magisk中刷入,重启。就可以欺骗系统通过这一检测,使证明通过。(测试系统版本为开发版MIUI 12.5 21.3.25)

Play 商店的话,清除数据就行。

注意开启 magisk hide。

2. Magisk模块出现问题导致手机卡死

停用所有模块即可。

手机连接电脑,打开 adb 工具,输入adb shell,提示成功连接后会出现venus:/的字样,再输入magisk --remove-modules,手机会自动重启,卡得没法重启,就长按开机键强制重启。

然后挨个排查,看看是哪个模块出现的问题。

一定要注意开启USB调试,否则只能靠刷回原厂镜像才能解决。具体可以参考:Magisk Frequently Asked Questions


  1. 以上关于「virtual A/B」分区的概念,是根据秋叶随风大佬的酷安动态简单概括得来的,其中可能有些遗漏或是错误,还请谅解。