随着Android 7.0的发布,Google推出了一种全新的系统更新方式,叫做A/B seamless update,我们这里叫做AB无缝更新。已经有越来越多的厂商在他们新推出的手机使用这种更新方式了,可以明显看出这是将来Android阵营的一大趋势。
既然是一种全新的更新方式,自然是要和以前传统系统更新方式区别开的。
传统的系统更新方式,需要将手机置入Recovery模式安装更新,安装更新往往要花上几分钟到十几分钟不等,这个过程中,你什么事情都做不了。原厂Recovery会将更新的临时文件存放进/cache分区里,这也就是/cache分区的主要目的。
按照Google的说法(参考https://source.android.com/devices/tech/ota/ab):
A/B 系统更新(也称为无缝更新)的目标是确保在无线下载 (OTA) 更新期间在磁盘上保留一个可正常启动和使用的系统。采用这种方式可以降低更新之后设备无法启动的可能性,这意味着用户需要将设备送到维修和保修中心进行更换和刷机的情况将会减少。其他某些商业级操作系统(例如 ChromeOS)也成功使用了 A/B 更新机制。
也就是说,整部手机是分为两个系统分区的。
相对的,传统的系统更新方式就叫做“A-Only系统更新”。
使用到这种更新方式的手机的分区结构
我这里挑选Nokia 7 Plus和Nokia X5作为高通机型和联发科机型的代表,分别介绍使用这种更新方式的机型是什么样的分区。
以上三张图是高通机型Nokia 7 Plus分区表的部分内容。你们可以看到,modem, xbl, abl, tz, rpm, hyp, pmic, keymaster, cmnlib, cmnlib64, mdtpsecapp, dsp, bluetooth, mdtp, vbmeta, devcfg, boot, nvdef, systeminfo, hidden, cda, splash, system, vendor这几个分区均拆分成了a和b两个部分。通俗的说,底层和上层系统是拆分成两份的。为了方便显示,这里定义的上层系统分区加粗了。
以上两张图是联发科机型Nokia X5的分区表。同样是底层分区lk, md1img, tee, spmfw, sspm, scp, odmdtbo, gz, cda, cam_vpu_1, cam_vpu_2, cam_vpu_3, hidden和boot, system, vendor拆分成了a和b两个部分。虽然联发科和高通的底层分区结构不太相同,但上层大体是一样的。
你们应该注意到,这是没有单独的Recovery分区的。
“什么?没有Recovery分区?那怎么刷TWRP?”
别急,我们后面再来慢慢说。
AB无缝更新基本的工作原理
下载完OTA更新包之后,手机会问你是否安装(也有可能下载完之后自动安装)。
安装的时候,手机会在后台静默完成。
假设你现在运行的是位于A部分的底层和上层系统。
如果你的OTA更新包是增量更新包(例如Google安全更新这样的),更新包会自动将这些A部分的底层和上层分区校验完整性,然后按照更新包里的内容更新之后写到B部分的对应分区里。更新完成之后,手机会问你是否重启,此时重启之后,底层会自动将下一个要启动的系统切换到B部分,重启之后就是已经更新之后的系统。
那么到了B部分之后,下一个更新来了怎么办呢?同样的,也是将B部分的底层和上层分区校验完整性,然后按照更新包里的内容更新之后写到A部分的对应分区里,然后让你重启,并切换到A状态。
如果是全量更新包(例如到Android Pie的大更新),安装更新的时候就不需要校验完整性,直接将更新内容写进另外一个部分。
你们应该注意到以上两个分区表内均没有cache分区,这是因为AB无缝更新本身的工作机制并不需要这个分区。因此,即便存储空间十分紧张,也不用担心腾不出足够的空间来安装更新,只要存储空间足够下载更新包就OK了。
这个A和B部分在Fastboot里的称呼叫“slot”(插槽/槽位)。
使用这种更新结构的手机如何获取Root权限?
A-Only系统更新的机型获取Root权限的普遍套路是刷入第三方的Recovery(尤其是TWRP),然后在这个基础上刷入通用的Root ZIP卡刷包(例如Magisk-v17.x.zip)。
哦,别跟我说那些一键Root工具,那都没用的。
AB无缝更新的机型因为没有单独的Recovery分区,要如何获取权限呢?
幸好,topjohnwu在开发Magisk的时候,支持直接在手机端处理手机本身的boot分区镜像,然后在Fastboot模式下使用。
以下是套路:
第一步:获取原始boot镜像并使用Magisk Manager处理成打了补丁的boot镜像(patched_boot.img)
第二步:在Fastboot mode临时从这个原始boot.img启动(很重要)
第三步:在手机上再次使用Magisk Manager安装一次Magisk,将Root权限固化
相信我,这个套路适用于所有的AB无缝更新机型的手机,并且使用这种方法获取Root权限有很多好处。
如果你愿意的话,也可以在A-Only系统更新机型上这么做。
这么Root完之后如何安装后续OTA更新?
Magisk Manager有一个功能,就是允许将Magisk安装到另一个未使用的槽位。
由于Magisk本身只处理boot分区,因此我们在安装更新之前,把Boot恢复回原厂状态就可以了。切记,必须是恢复原厂镜像,不是用Magisk卸载包。
因为原厂Boot镜像有原厂通过验证启动的签名,如果使用Magisk卸载包的话会使这个签名丢失,Boot仍然过不了完整性校验。
AB无缝更新机型在安装更新的时候,是在正常系统下操作的,而你把Boot恢复回原厂但不重启的这个时候,Root权限依然还在。因此,等到系统更新安装完成之后,问你是否重启的时候请选择“稍后重启”(很重要,否则Root权限在更新完之后会丢失),然后打开Magisk Manager,安装Magisk到未使用的槽位,装完之后重启即可。这么一来,Root权限就可以被继承到新版本的系统下。
没有Recovery分区,那怎么在紧急情况下恢复出厂设置和ADB Sideload?
别急,没有Recovery分区不等于没有传统的Recovery。Recovery和Boot是合二为一的。
AB无缝更新的机型依然有Recovery,手动进入方法取决于厂商和机型。
进入之后,你会看到一个倒地机器人和No command提示,这个时候按住电源键的同时按一下音量加,就可以调出Recovery菜单。
然后你应该知道怎么做了吧。
但需要注意,除了诺基亚国行固件之外,其它绝大多数手机如果在Recovery下恢复出厂设置之前登录了谷歌账户,这么恢复出厂设置之后会触发谷歌锁,因此请尽量不要在Recovery下恢复出厂设置。
怎么刷TWRP和第三方ROM?
首先,你的手机必须要被TWRP官方适配。
一般AB无缝更新机型官方适配的TWRP,会给一个TWRP镜像和一个TWRP-installer的卡刷包。
首先,你要把TWRP安装到另外一个没有使用的插槽里(具体可以使用.\fastboot getvar current-slot判断),通过那个插槽进入TWRP之后,再在这下面Install ZIP – TWRP-installer。
具体请参考TWRP for Razer Phone。
如果是Treble GSI的话,你可以使用fastboot命令刷入。
在确定了当前插槽之后(假如是A),执行以下命令进行刷入:
.\fastboot flash system_a /path/to/treble/gsi.img
.\fastboot -w
.\fastboot reboot
AB无缝更新和小米1/2的双系统是否原理一样?
只能说思路一样,但是原理并不相同,毕竟更新包的结构都不一样。
(TBA)