本文作者:柯帕,路中南

作为一个拥有和管理系统最高权限的应用,Magisk App 有一定的使用门槛。差若毫厘,谬以千里,如果不清楚某个开关代表的意义,一个小小的误操作就有可能引发无法开机的严重后果。本文将从官方文档与个人经验出发,为大家介绍 Magisk App。

文章内容和截图基于 Magisk v23,涵盖新 Magisk App 的四个主要功能:安装和卸载 Magisk;授予应用 Root 权限;隐藏 Magisk;获取和管理模块。在奔向 Magisk 的自由天地前,强烈建议你先阅读此文了解少数情况下的应对措施,这也是本文出现在模块推荐文章之前的原因。如果你还不知道如何刷入 Magisk 的话,可以参考上一篇文章。

拓展阅读:Android 玩家必备神器入门:从零开始安装 Magisk

安装和卸载 Magisk

Magisk App 第一屏便是负责 Magisk 镜像安装和卸载的界面。这个页面的功能往往和具体的使用场景绑定在一起,因此,下文用四个不同的情境来介绍 App 这个界面下的几个重要功能。

img

情境一:安装 Magisk 到原系统

上一篇 从零开始安装 Magisk 的文章中,我们遇到的就是这种情境。结合 Ramdisk 的值,使用 Magisk 图标旁的「安装」> 「选择并修补一个文件」功能,Magisk 会修改我们提取的镜像供我们用 fastboot flash刷入或者fastboot boot引导进入系统。

这是 Magisk App 最为基本的用途,除了少部分新机型外,这也是刷入 Magisk 最稳妥的方式。在每一次更新系统后,我们都推荐按此流程重新刷入。

情境二:Magisk 需要更新或者修复

在 Magisk v22 之前,每一次新版本发布都会提供 magisk.zip 与 magisk.apk 两个文件,前者代表着将被注入到系统的 Magisk 本体,后者则代表着用于管理和使用 Magisk 的应用。因此每一次打包 boot.img 镜像或是直接刷入到系统前,都需要下载一次托管于 GitHub 的 magisk.zip,十分不便。

在 Magisk v22 后,.zip 包与 .apk 包合二为一,安装的 Magisk App 本体自带了刷写功能,更新了应用本体即等于更新了即将准备注入到系统的 Magisk,不必频繁请求网络下载。

在检测到系统已经刷入 Magisk 后,Magisk 图标旁的「安装」子界面会多出一个「直接安装」选项。「直接安装」会将和 App 相同版本的镜像刷入系统。如果 Magisk 的一些功能莫名其妙地失效,可以尝试使用此功能重新挂载 Magisk。

而如果需要更新的话,按照前文提到的流程,只需要先在应用内根据提示更新 App 本体,再点击「升级」按钮就能自动刷入。

情境三:进行系统 OTA

系统在下载更新包后,会在安装前进行系统的完整性检查。很多 Root 工具因为修改了底层文件,导致系统无法通过此项检查而不能安装 OTA。Magisk 的优势正是「挂载」而非「改写」。当然,想要完成 OTA 还需要我们的手动操作。

首先,为了防止系统自动安装更新导致更新失败,刷入 Magisk 后的第一步就是关闭系统的「自动安装更新」选项。类 AOSP 的系统中,这个项目一般位于「开发者选项」界面;改动比较大的系统中,这个选项可能位于系统更新 App。

读者应该记得,我们在安装 Magisk 时的确修改了系统的 boot.img 或者 recovery.img。因此,在收到厂商推送的更新后,我们需要点击 Magisk App 首页的「卸载 Magisk」>「还原原厂镜像」(不要重启)来恢复原来的镜像。此时理论上 OTA 应该能够正确安装。

img禁止更新图片来自官方文档

下载 OTA 并安装后,系统会提示重启,重启后我们会失去 Magisk。因而我们还需要按照上一篇文章「打包镜像并刷入」章节中提到的提取镜像 > 修改镜像 > 刷入/引导启动镜像的方式再次安装 Magisk。

和 Magisk 本体不同,模块不需要重新安装。Magisk 将模块储存在一个文件夹(/data/adb/modules)中,每次设备开机时,Magisk 会自动挂载该文件夹下的模块。原厂镜像无法挂载这些模块,但并不意味着这些模块文件被删除了;只要重新安装 Magisk,这些「蜇伏」的模块又能生龙活虎。

根据多年以来的刷机经验,分享给诸位一些重装时的技巧:

  1. 并非每一次系统更新都会大幅改动 boot.img 或 recovery.img,也就是说,旧系统被 Magisk 打包过的镜像也极有可能顺利引导启动新系统。如果我们事先保存或者备份过旧系统中经 Magisk 修改过的镜像magisk.img,系统更新后,在 bootloader 界面下用 fastboot boot magisk.img 尝试引导启动旧镜像,若系统和 Magisk 都正常,那么就不必再费心思提取新系统的镜像,点击「安装」>「直接安装」,此时「直接安装」的对象是新系统的分区,这样我们就能顺利为新系统刷入 Magisk 。
  2. Magisk App 能在 A/B 分区设备上保留 Magisk 进行系统更新。若 App 首页的 A/B 一栏值为「是」,我们只需要在重启安装 OTA 前点击 「安装」>「安装到未使用的槽位」选项即可。不过,经知名用户 Clyde 反映,部分在 OTA 时带有分区校验的系统,如 Pixel 的 ROM 使用此方法大概率会发生引导循环。出现相关问题还是直接一点,转用上文提到的通用刷入方式。

img

携 Magisk 进行系统 OTA 的流程可以总结为:关闭「自动安装更新」> 收到 OTA >「卸载 Magisk」/「还原原厂镜像」> 下载并安装 OTA >

  • A/B 分区为「是」的设备:不重启 >「安装」> 「安装到未使用的槽位」> 重启以更新系统。
  • 其他设备:重启以更新系统 > 重新安装 Magisk。

如果遇到无法更新的问题,尝试不清除用户数据的刷写系统全量包方式,而后重新安装 Magisk。一加等机型在检测到 Magisk 后会自动下载全量包。常备全量包,翻车不慌张。

情境四:完全卸载 Magisk

在「卸载 Magisk」命令下还有一个「完全卸载」,点击此命令会在重启设备后卸载一切已经安装的模块和 Magisk 本身。

这个命令仅在我们想和 Magisk 说永别的时候用。想要卸载单个模块请参考本文第四章内容;Magisk 使设备出现问题时,建议排查 MagiskHide 和可疑模块,而非完全卸载。

授予应用 Root 权限

Android 是以 Linux 为内核的系统,在 Android 上获取 root 类似于在 Linux 上使用了 root 帐户。有了 root 权限,我们便能修改底层文件、注入脚本、调节系统性能、读取更详细的数据……当然,这一切并不需要我们手动去写脚本,我们需要做的只是通过 Magisk 将 root 权限授予给能够完成这些事情的应用们。

索取 root 权限的请求由应用发起,Magisk 此时会跳出类似于 Windows UAC 的弹窗供用户确认。想要防止恶意应用模拟点击,可以在 Magisk App 的设置中开启「生物识别验证」和「点按劫持保护」两个选项。

img

授权了应用之后,Magisk 默认会在该应用使用 root 权限时弹出通知,并且记录相关的日志。这两个选项隐藏在 Magisk App 的超级用户界面中,通过单击已授权的应用名称,便能找到控制通知和日志的开关。

img

用户授予 root 权限是将手机的完整控制权交给这个应用,因此请务必保证此应用值得信任。如果你在主力机上使用 root 权限,更应该保持克制和敬畏。

此处另外提一些关于授予 root 权限的小技巧:

  • 不少应用索取 root 其实只是为了获得系统底层的部分权限,这部分授权其实无需 root,我们大可以用 adb 输入一次命令授予,比如我们之前聊过的 Buoy,或是 Gsam Battery Monitor 等电池监控类应用。
  • Root 被认为是一种低效、慢速的处理方式,Shizuku 应运而生。它可以被当作 root 权限与需要 root 权限的应用之间的「中间商」,通过 root/adb 提升权限后,再为那些需要使用系统 API 与 adb 权限的应用授权,这比 root 权限更高效。如果你在使用「小黑屋」、「冰箱」、「App Ops」等应用,建议先安装 Shizuku 后再通过它来为这些应用授权。

拓展阅读:在权限管理上跑过 iOS 14 和 Android 11:App Ops 4.0 上手指南Shizuku 简介

通过 MagiskHide 隐藏 Magisk

正因为 root 权限和将要提到的模块所带来的潜在危害,一些涉及版权、金融、通讯功能的应用会事先检查系统是否「完整」,它们若发现系统已 root 或者挂载了一些模块,会以此为由弹出警告乃至直接退出,还可能会对用户可获取的内容做一些限制。为了解决这类应用对用户所造成的不便,Magisk 设计了 MagiskHide 功能。

首先,点击 App 首页右上方的齿轮,勾选「MagiskHide」,这时,Magisk 超级用户界面会多出一个 MagiskHide 子界面。

在针对应用隐藏 Magisk 前,我们可以先试试检验设备能否能通过位于 App 首页的「测试 SafetyNet 证明」。点击位于首页的测试按钮,第一次测试需要下载额外的组件,测试还要求设备能正常访问 Google,因此请确保网络正常1。不出意外的话,不久后会弹出「通过证明」的文字。

img

如果 basicIntegrity 没有通过,说明系统镜像完整性有问题,这一般发生在第三方 ROM 中,我们可以尝试安装 Universal SafetyNet Fix 模块或者更换 ROM 来解决这个问题。如果 ctsProfile 没有通过,大概率是设备或 ROM 未经认证。安装 MagiskHide Props Config 模块一般能解决此问题2。模块的安装请跳转到第四章查阅。

确认 SafetyNet 测试通过后,接下来我们勾选想对其隐藏 root 事实的应用。

img

一般说来,下列四类应用常常有 root 检测行为和反制措施:

  1. 提供版权和地区限制内容的应用:如 Google Play 检测到 root 后,设备会变成「未认证」状态,我们将无法搜索到 Netflix 等流媒体应用。
  2. 支付应用:如云闪付,该应用在检测到 root 后会弹出警告,并直接隐藏指纹支付选项。
  3. 通讯应用:如 ZohoMail,它会在检测到 root 后提示用户登出。
  4. 游戏:部分游戏有严格的反作弊机制,检测到 root 后可能拒绝用户游玩。

通过自己实际遇到的问题或者是翻阅网络资料,我们可以确定对哪些应用隐藏 Magisk。在 MaigskHide 界面直接点击某应用的选择框,Magisk 会自动为我们勾选应用下的组件。如果在勾选之前就已经打开过该应用,我们可能还需要清除一次应用的缓存乃至数据。

根据作者的说法,此功能属于「dirty hack」,在使用时应尽量保持克制。不含有 root 检测机制的应用,不建议勾选。

如果在上述设置后,还发现有应用检测到 root 权限,我们可以打开 Magisk 设置里的「隐藏 Magisk 应用」选项。点选后,Magisk 会更改自己的应用名,用户需要通过搜索或者创建的快捷方式访问改名后的 Magisk App。这样能防止在低版本系统中,部分应用扫描用户应用列表时检测到 Magisk 进而判定系统已 root。

获取和管理模块

模块是大部分用户选择安装 Magisk 的原因,它们是一个个开箱即用的系统修改包或修改包的组件。模块既可以从 Magisk App 中自动下载安装,也可以从网络下载然后手动安装,部分拥有 root 权限的应用还可以越过用户的授权直接安装模块。

由于不同的 Android 设备差异实在太大,同样的模块难以保证完美适用于所有设备;不同的模块、应用和用户对系统的其他修改有时候会产生冲突,进而导致一系列严重问题;一些模块本身也像应用那样,需要有一个逐渐完善的过程;也有的模块本来就是不完整的,需要其他模块的辅助。因此,安装模块千万要遵循流程。设备出现问题后也不要慌,有的是简单且易操作的解决方案。

安装模块的基本流程

安装模块分三步:阅读模块说明 > 确认相关依赖状态 > 安装模块并重启。这三步中,最重要的当属第一步,因为它直接决定了当前模块是否符合自己的需求,能不能安装使用。下面以能在 Magisk App 找到的内容拦截模块 Energized Protection 为例,详细讲解这三步。

我们进入 Magisk App 的第四屏模块界面,利用搜索找到 Energized Protection。点击模块右下的文件夹图标即可阅读它的说明。由于是从 GitHub 上获取,如果模块说明无法加载,你可以尝试开启设置中的「安全 DNS」。这些应用内模块实际上都托管在 Magisk Modules 库下,我们也可以选择使用电脑访问 相关的 Repo 来阅读模块说明。

img

模块说明中最重要的是两部分内容:模块的依赖和用法。许多模块是协同其他模块或 App 工作,在安装这些模块之前,必须确定相关依赖的状态。例如,Energized Protection 告诉我们它需要 Systemless Hosts 这个模块,Magisk 20.4 之前的版本还需要安装 Busybox for Android NDK。它使用的方法是命令行,因而我们还需要一个 Android 平台的终端,比如说 Termux

img

确认这些依赖都装好了之后,点击「安装」,重启系统,这个模块才算安装完成。如果安装的模块和你素未谋面,那么本文不建议一口气安装很多个。

不在 App 列表中的模块,例如 NotoCJK,模块说明在发布处,安装模块需要使用模块界面最上方的「从本地安装」命令,然后选择下载的模块压缩包。

模块翻车后的自救

安装模块后手机出现应用闪退、显示错误和无法开机等种种异常,大概率是使用的某个模块出了问题。针对不同情况,目前有五种比较简单的自救方式:

  • 如果还能访问 Magisk App,在模块界面中,「移除」出问题的模块,然后重启以完全卸载此模块。
  • 如果已经无法打开 Magisk App,但能使用 adb,用数据线连接电脑,输入 adb wait-for-device shell magisk --remove-modules,这会删除所有模块并重启。
  • 如果连 adb 都不能访问,那么请尝试进入安全模式。不同机型安全模式启用方式不同:开机状态下,比较常见的启用方式是按住电源键呼出的重启按钮;关机状态下,一般能通过特定的实体按键激活。进入安全模式后,Magisk 会自动禁用所有模块。再重启一次,模块禁用的状态会被保留,设备应当能恢复正常。

img

  • 如果装有第三方 Recovery,利用 Recovey 的文件管理功能(高级 > 文件管理),定位到/data/adb/modules,将其中的问题模块重命名为「remove」,Magisk 会在重启时自动卸载该模块。更简单粗暴的方式是直接删除该目录下问题模块文件。

img

  • 装有第三方 Recovey 时,我们还能将 Magisk.apk 重命名为uninstall.zip,在 Recovery 下刷入,这可以完全卸载 Magisk,潇洒弃坑走人。

Magisk 让设备具有了极高的自由度的同时,也让其承担着很大的风险。但欲戴其冠,必承其重,因此本文在展示 Magisk App 的四项核心功能的同时,也附带阐述了如何携 Magisk 正常进行 OTA,如何解决模块翻车等重要问题。

这些措施能最大限度地保证设备数据的安全,不过想要防「翻车」于未然,最重要的还是提高自己的鉴别能力与信息搜集能力,谨慎对待那些来源可疑的模块和应用。

我们模块推荐篇见。

扩展阅读