Magisk Technical Details - monsterxcn/myBlog GitHub Wiki

此页为 [Magisk] Root for the Galaxy S10 Series - XDA Developers Forums 帖子中 Technical Details 的简体中文翻译

 

技术细节

谷歌在「Treble 计划」中强制要求所有搭载 Android 9.0 系统的设备使用 system-as-root,所以三星终于推出了自己「风味」的实现。关于 system-as-root 的更多细节可以在 谷歌官方开发网站 上找到。三星使用的是 A-only system-as-root 设定,这意味着其启动镜像将只包含内核二进制而不包含 ramdisk。类似的设定已经被部署在许多新设备上,而这些设备的解决方案相当简单:在启动镜像中添加一个新的 ramdisk 部分,然后 hexpatch 修补内核使其总是使用 ramdisk 作为 rootfs。然而在三星的情况下,Bootloader 根本不会将内核二进制以外的任何东西加载到内存中,这意味着无论我们怎么做,内核都会一直使用系统分区作为根目录。这让我们别无选择,只能将 Magisk 安装到 Recovery 分区上。

(将 Magisk)安装到 Recovery 分区有其自身的问题:首先是系统启动时,会运行一个名为「flash_recovery」的服务,在启动时将恢复镜像恢复至原样。这是不可接受的,因为在这个过程中不仅会卸载 Magisk,而且由于三星的数据加密密钥与 Bootloader 状态、启动/恢复映像签名绑定,数据加密密钥也会被更改,从而导致设备在后续重启时无法启动,除非进行出厂重置。解决这个问题的方法是简单地重新打包启动映像,以去除二进制完整性和分区签名。第二个问题是,由于 Magisk 和 Recovery 共享同一分区,我们如何才能真正启动到 Recovery?(例如,要对设备进行出厂重置,或者让 Custom Recovery 与 Magisk 共存)幸运的是,我们引入了一个检测按键按压的解决方案,详细内容已经在说明中提供。

更糟糕的是,三星推出了「VaultKeeper」服务,在 Bootloader 的 OEM 锁上又加了一把「锁」。默认情况下,该服务会在数据被擦除后「重新锁定」Bootloader。只有在初始设置后,它才会验证 OEM 锁选项,并相应地更改 Bootloader 的状态。如果你正在原始系统上运行定制的固件,请不要 尝试擦拭数据,否则你可能会因为 VaultKeeper 锁定 Bootloader 导致后续 Bootloader 因为检测到非官方分区而拒绝启动,最终导致你的设备崩溃。

对于定制 ROM 开发者来说,你首先要删除的是 VaultKeeper,以保护你的用户不至于把他们的设备弄坏。对于原版 ROM 的用户,只要确保在数据擦除后总是启动至 Magisk,或者在完成初始设置并验证 OEM 锁是否启用之前永远不要关闭你的设备。