我觉得我再不写就会把之前的步骤忘掉了,所以趁着没忘掉,赶紧先记一下…

免责声明:以下内容仅供参考,如果您要做,请搞清楚您在做什么,如果不清楚,请不要做!以下内容只是我个人情况的记录,如果照做导致问题本人不对产生的后果负责!

乱谈 - 选手机

因为该死的 Delta 导致进出小区又得扫码了,而随着支付鹫和微信的不断更新和我手机不变的硬件规格,导致进小区扫健康码和便利店/超市结账之前都要提前很久来启动应用来避免结账时等待应用启动和扫码时的尴尬。一直因为很恶心现在各大厂商因为某果公司起头而开始的在屏幕上各种挖空打洞的做法而没有考虑更换手机,但迫于目前那两大扫码应用的启动速度太感人,于是最终还是决定妥协,换个手机好了。

之前意向购买的手机大概是这样:

  • 屏幕不缺口不打洞(屏幕四角圆角还算可以接受)
  • 有 3.5mm 耳机孔
  • 有开源 ROM 可刷
  • 价格不算太离谱

某果公司有个很奇怪的特性是,不管再匪夷所思的事情,只要某果起头做了,那别的厂商就都跟着无脑去抄。某果 UI 是一个例子,刘海屏是一个例子,去 3.5mm 耳机孔是一个例子,不再附赠电源又是一个例子。因为全面屏技术不成熟而导致屏幕被啃掉一块儿的妥协做法实在让人看着难受,为了手机薄一点而干脆去掉耳机孔也是个很奇葩的做法。跟风的安卓厂商甚至能发明出“水滴之美”的营销宣传语,并做着意外突出很多的摄像头使人不得不使用手机壳来补充摄像头突出产生的高度差,然后看着手上厚厚的手机却连个耳机孔都没有…

当然,也因为这些安卓厂商的跟风,以至于不做出一点妥协就实在没手机可选了,于是只得妥协了屏幕打孔和耳机孔。想到如果早点计划买手机的话还有非打孔的 k30 可以少妥协点东西,但现在才这么想也已经没用了。至于开源 ROM,则是因为屡出安全问题1的国行 ROM 使得我不再敢于信任国行 ROM,于是“能刷”变成了不可妥协的一条要求,而由于自行编译 LineageOS 甚至仅仅是 TWRP 都需要近 50 G 的磁盘空间,加之我截至目前也确实没有自行编译 ROM 的经验,故自然还是会优先选择有受到开源 ROM 官方支持的机型。

由于“能刷”这一不可妥协条件就能淘汰绝大多市面在售手机了,于是其实并没有太多手机可选。小米在售的主流红米和小米机器只要不是联发科 SoC 就大概都可以刷,要么现在就有受 LineageOS 或 crDroid 之类官方支持的 ROM 包,要么在一段时间内也可以等到社区或官方的移植。红米 K40 在国外以小米 11X 和 POCO F3 的名义进行售卖,并且也已经有了 LineageOS 和 crDroid 的官方支持,考虑到价格也算可以接受,于是最终决定选这款机型,并最终购买了这款手机。

等待刷机 - 准备工作

手机到手的第一天自然是感受了一下 ADUI 的厉害,手机放置了一晚上就冒出了一大堆甚至我启动都没启动过的应用的广告通知,尽管这些第三方应用的通知我删掉那些应用就好了,以及来自 ADUI 自身的广告也大都有选项可以关掉2,不过我本来也打算要刷的,于是这些就没再管了。

因为要刷的前提是要解锁,于是到手后没多久下载了官方的解锁工具,发现需要登陆小米账号并插卡联网才可以申请解锁,并且需要等待整整七天,于是那就等呗,直到七天后才解锁,索性七天之后解锁过程没遇到别的什么意外情况,还算比较顺利。

失败尝试

因为之前手机在用的是 LineageOS,而据说 crDroid 有很多比 LineageOS 好的特性,之前因为怕丢数据和嫌麻烦而没去折腾,故打算借此机会试试 crDroid,于是当天解锁之前自然也准备好了 crDroid 提供的注明了 POCO F3 的代号 alioth 的手机的 ROM 包,OpenGApps 以及一个第三方维护的 TWRP。

解锁蛮顺利的其实,于是解锁后 fastboot flash boot twrp.img 了第三方的 TWRP 并刷入了 crDroid 包。印象里刷入前选择了格式化分区但不记得有没有先清除 Dalvik 缓存,刷机后重启则进入了 crDroid Logo 动画的无限循环。等待十多分钟无果后,决定重刷却发现 TWRP 再也无法刷机成功了,反复确认双清步骤并重新刷入也会提示错误,错误内容还包含磁盘解密失败和无法挂载的提示,甚至这个 TWRP 的 ADB Sideload 模式也始终无法正常使用,就开始怀疑是不是 recovery 的问题。后来去 LineageOS 官网下载了上面提供的 recovery,尝试 sideload crDroid 的 ROM,仍然会在 sideload 传输完毕进行安装脚本时提示其它错误,实在没办法,就决定还是先刷 LineageOS 的 ROM 确认下是不是也有问题好了。

成功尝试

crDroid 比 LineageOS 奇怪的地方大概在于,由于前者规模看上去小很多,机型没有对应的文档也没,更没有对应的刷入和升级相关的指南页面了。LineageOS 提供了非常完备的刷机步骤 供阅读,尽管内容实际只是如何解 BL 锁和 sideload 安装包,但还是有很详细的提示和注意事项来避免出错。LineageOS 有一个特别的提示我后来才注意到,内容是说旧的 fastboot 并不支持新的 AB 分区结构,不过好在我进行操作的过程在使用的是随解锁工具附带的 fastboot.exe,所以大概没有遇到问题。

由于是 AB 分区的设备,没有单独的 recovery 镜像,故实际是刷入 boot.img (fastboot flash boot xxx.img 而不是 fastboot flash recovery xxx.img)的,此后正常进入 recovery 后就是常规的 adb sideload xxx.zip 了。实际我之前并未接触过有 A/B 分区无缝更新支持的手机,于是其实这次刷机时这个概念也让我困惑了一小阵子,但好在目前刷入的过程并不需要管这个概念。只需要知道当前活动槽是 A 的话,实际就会刷入到非活动槽 B 中就是了。

使用 LineageOS 的 recovery 刷入 LineageOS 的 ROM 3过程是非常的顺利,刷机完毕后可以进入系统(因为上面遇到的 crDroid 失败,于是为了验证到底是不是成功了,我没在刷入 LineageOS 后就立即刷入 OpenGApps),于是大致推测可能是 crDroid 包和那个第三方移植的 TWRP 都有问题吧。

刷入并成功启动 LineageOS 后,决定还是老老实实 LineageOS 好了,于是回 Recovery ,清除 Dalvik 缓存并 sideload 了 OpenGApps4,启动后也非常顺利的配置了谷歌服务,最后安装 Magisk Manager 手动 Patch 了 LineageOS 的 Recovery 镜像5并将其重新刷入,于是 Magisk 也算顺利搞定了,这次刷机或许也就这么告一段落了。

这篇文章到现在才发出来是因为这个过程还有一些东西我并没搞懂并且也不知道实际行为到底是怎样的,比如暂时还不清楚 fastboot flash boot xxx.img 是只写入了 AB 分区的其中一个槽还是会同时刷入到两个槽中,以及此后若 LineageOS OTA 更新的话是否需要做别的额外操作(看上去如果 OTA 更新走 AB 分区的话,大概会需要更新后在重启到更新的系统前用 Magisk Manager 提供的选项覆盖掉另一个槽刚刚刷入的 Recovery)。因为怕上面的东西被忘掉,所以趁着还记得就赶紧记录一下,后续那些东西搞清楚了再来更新这篇文章的记录好了。惯例,2021年8月29日01点22分。

Update (2021年9月1日00点10分): 刚好于一周后收到了 Lineage 的 OTA 更新。也确实不同于 3T 的传统形式更新,下载完点击安装更新就会重启到 Recovery 中进行更新。A/B 无缝升级的 Lineage 在点击更新后会在后台跑进度条,等进度条跑完会提示重启,重启之前去 Magisk Manager 中点击【安装>安装到未使用的曹位(OTA 后)】然后重启就可以了。

  1. 之前的博客大概提到过,oneplus 的剪切板监听上传事件,小米的浏览器自带随网络更新的域名访问黑名单事件。均有来源存档并亲自验证真实性,这里懒得再贴一次来源了。 

  2. 大部分只是关闭广告的选项藏得有多深的差异。 

  3. 为了方便日后参考,此时使用的 Recovery 为 lineage-18.1-20210821-recovery-alioth.img,ROM 为 lineage-18.1-20210821-nightly-alioth-signed.zip,OpenGApps 为 open_gapps-arm64-11.0-pico-20210820.zip。刷入失败的 crDroid 为 crDroidAndroid-11.0-20210816-alioth-v7.9.zip,第三方 TWRP 链接不再给出,毕竟 sideload 模式都进不去,问题确实太大了。 

  4. 尽管按照 LineageOS 安装页面的说法说必须紧跟着 ROM 后在首次启动前刷 OpenGApps,但实际是只要清 Dalvik 缓存就可以了,并且后续刷 GApps 的好处是,ROM 首次安装后的启动配置向导就不会要求连接网络并配置谷歌服务完事儿才能使用手机了。 

  5. 据 61 说,MagiskManager 的 apk 文件是可以直接当刷机包 sideload 刷入的,我没实际尝试… 9/1 update: 用 3T 验证了一下,确实可以直接把 magisk apk 当 zip 刷机包直接刷入,尽管尝试的是在 recovery 中选那个 apk…