今天为大家介绍一款神奇的 Android 第三方接口 —— Magisk
1. Root —— 玩家与厂商间的博弈
Android 从诞生之日起就高举着开源的大旗,这也是它成功的原因之一。而它的开放性也成功的吸引到了一大批爱折腾的人,从而诞生出了 root(此处特指 Android 中的 root)。
根据维基百科的释义,root 指的是使用户取得 Android 操作系统的超级用户(Super User)许可权的技术。用户通过 root,可以越过手机制造商的限制,卸载手机制造商预装在手机中某些应用,以及运行一些需要超级用户权限的应用程序。同时,root 也可能会让手机变得“不安全”(并不是说 root 使手机变得不安全,而是一些用户的使用习惯会使 root 后的手机变得危险)。
但是从棉花糖(Android 6.0)开始,Google 基本阻止了以前版本中最流行的 root 方法 —— 即,将 su守护程序 放置到 /system 分区,并在启动时取得所需的权限。道高一尺,魔高一丈,于是就出现了 systemless 的 root 方式,因为它不采取任何方式修改 /system 分区。
出于增加安全性的考虑,Google 推出了 SafetyNet 这样的检测,以确保 Android Pay 等一些 App 的安全运行,玩家不得不在 root 权限和一些有价值的 App 之间作出选择。这个时候 Magisk 诞生了。
2. 什么是 Magisk
Magisk 是出自一位台湾学生 @topjohnwu 开发的 Android 框架,是一个通用的第三方 systemless 接口,通过这样的方式实现一些较强大的功能。
看似很简单的一个框架,甚至与大名鼎鼎的 Xposed 框架在功能性上有点重复。很多人批评 Magisk的模块太少了,想替代 Xposed 根本不可能(在那个 Xposed Framework for Android 7.0 难产的时代,很多人将 Magisk 看是做是 Xposed 的替代品)。这是不正确的,因为 Magisk 从来没有想过要代替 Xposed ,Magisk 与 Xposed 是可以互相兼容的,你甚至可以通过 Magisk 来安装 Xposed(安装 Xposed 后就不能绕过 SafetyNet 了)。
Magisk 的厉害之处在于它实现了一种绕过 SafetyNet 使用 root 的方法。
实现原理:由于它是通过启动时在 boot 中创建钩子,把 /data/magisk.img 挂载到 /magisk,构建出一个在 system 基础上能够自定义替换,增加以及删除的文件系统,所有操作都在启动的时候完成,实际上并没有对 /system 分区进行修改(即 systemless 接口,以不触动 /system 的方式修改 /system)。
3. Magisk 是如何工作的?
在一些用户眼里,Magisk 与另一款名为 Xposed 的神器有着高度的相似性,部分群体当中甚至还存在着「Magisk 框架」这样的说法。
的确,二者的工作机制都是「拦截」。Xposed 通过劫持 Android 系统的 zygote 进程来加载自定义功能,这就像是半路截杀,在应用运行之前就已经将我们需要的自定义内容强加在了系统进程当中。
Magisk 则另辟蹊径,通过挂载一个与系统文件相隔离的文件系统来加载自定义内容,为系统分区打开了一个通往平行世界的入口,所有改动在那个世界(Magisk 分区)里发生,在必要的时候却又可以被认为是(从系统分区的角度而言)没有发生过。
Magisk 的实现方式就像是一种魔法,当被挂载的 Magisk 分区被隐藏甚至被取消挂载时,原有系统分区的完整性丝毫未损,玩需要 root 验证的游戏、运行对设备认证状态有要求的应用甚至进行需要验证系统完整性的 OTA 更新都没有任何问题。
因此严格来说 Magisk 可以被看作是一种文件系统,这种文件系统通过巧妙的实现方式避开了对系统文件的直接修改,从稳定性上来看要优于以往任何一种系统框架,这也是当前它在玩机社区广受认可和好评的原因所在。
4. 它的魔力不止于 root
很多人对 Magisk 的初步认识可能是 root ——在 SuperSU 销声匿迹之后,它自然而然就成为了当前 Android 社区用来获取 root 权限的主流方式。
不过 Magisk 特殊的运作机制还赋予了它相较于 Android 平台其他定制工具而言独一无二的特质——systemless。这种 systemless 特质让 Magisk 拥有了获取 root 权限之外的诸多优势:
一方面,得益于独特的挂载机制,使用 Magisk 时我们可以有针对性地隐藏 root,甚至暂时隐藏 Magisk 本身。
如此一来,不仅「root 模式下使用特定应用」成为了可能,就连无缝 OTA 更新这种「魔改党」们想都不敢想的事也变得不再遥远。在 Magisk Manager 应用的设置中,我们甚至还可以用随机包名对 Magisk 进行重新安装,让它从其他应用的眼皮底下彻底消失——多么具有魔法特质的高明手段!
另一方面,挂载系统的存在,也让 Magisk 拥有了多样的模块化生态系统。
既然用了「开外挂」的实现方式,那不妨就多挂载一些额外的东西,字体、音效、驱动……甚至 Xposed 本身。Magisk 提供了一个独立于系统分区以外的、可以随时隐形的「沙盒」,那自然不能将其才华禁锢于 root 这一件事上。在 Magisk 的模块仓库里,我们可以找到各式各样的模块(modules)来满足自己的定制化需求,借助这些模块,我们在 root 之后能做的事情其实也还有很多。
在这里的讨论语境下,Magisk 如何给人们留下「框架」这一认知误区的原因就浮出水面了。只是功能方面好不逊色的 Magisk,稳定性和上手门槛对大部分用户来说都更加友好。
5. 如何安装 Magisk
作为一套复杂的文件系统,Magisk 的安装步骤却是十分简单。
在电脑上配置好adb 环境并解开 Bootloader 锁后,如果你的设备有来自TWRP的官方支持,只需在打开 USB 调试后将手机与电脑相连,然后打开电脑端的命令行窗口:
- 执行
adb reboot bootloader
进入 Bootloader 界面 - 执行
fastboot boot TWRP.img
进入临时 TWRP - 在 TWRP 中刷入你下载的 Magisk 安装包
没有官方 TWRP 支持的设备安装 Magisk 的步骤要稍微复杂一些:
- 从你的刷机包中提取当前固件的 boot.img 文件,将它传入到安装了 Magisk Manager 的手机中
- 进入 Magisk Manager —— 安装(install)—— install —— 修补 boot 镜像文件
- 然后选择传入的 boot.img 文件进行生成,并将生成后的 Patchedboot.img (姑且这么命名) 传输到电脑上。
随后我们使用 Magisk 应用对 boot.img 进行重新打包:
- 打开命令行窗口
- 执行
adb reboot bootloader
进入 Bootloader 界面 - 执行
fastboot boot Patchedboot.img
来加载生成后的 boot 分区文件获取临时 root
此时进入系统,你会发现你已经成功安装了 Magisk(如果显示没有安装则为获取失败,请检查操作过程重新尝试),但这还不够,我们还得进入 Magisk Manager,选择安装(install)——install——Direct Install(直接安装)才能将临时 root 转换为永久 root。
三星、华为等特殊机型的 Magisk 安装方法参见 Magisk 官方帮助文档。
安装完 Magisk 后,我们就可以通过 TWRP 或者 Magisk Manager 刷入获取到的模块了。模块的获取方式可以是 Magisk Manager 自带的模块仓库,也可以是其他第三方论坛获取等。
卸载 Magisk 最为彻底的方式就是在 Magisk Manager 中点击「卸载」、「完全卸载」,应用会自动下载刷完 uninstall.zip 卸载包、自动卸载它自己、自动重启。如果你无法进入系统,在 TWRP 中手动刷入 uninstall.zip 卸载包即可。至于哪些模块值得刷,就是完全看个人需求了。
6. 结语
Magisk 的设计包含了许多奇妙的构想,呈现到功能上来让人惊呼 Magic。如果想要最大程度地对 Magisk 魔法般的功能善加利用,必须足够熟悉 Magisk Manager。大胆尝试、谨慎操作,补全系统的特性,或是增加自己想要的功能,让手中的设备成为一台梦想机,享受美好的数字生活。
部分内容选自:每个 Android 玩家都不可错过的神器:Magisk 初识与安装