起因是这样的,很久之前(大概 1 年前吧),有一部 Google Pixel5 手机,是拿来做测试的。自然是少不了折腾,magisk、太极等都安排上。结果在一次操作失误后,把手机重置了。于是又只能重来一遍,结果在刷入 Magisk 的时候失败了,导致手机无限重启,当时还挺后悔,想着用不了了,后来就晾在一边没管了。
结果上周,心血来潮给手机充了个电,居然又能用了?时间居然真的可以修复 bug 吗🤣
安卓这块确实不是很熟,于是决定恶补一下这里的知识
一些概念#
- OTA
OTA(Over-The-Air)映像是指通过无线方式传送到设备上的系统或应用更新包。OTA 更新允许设备制造商、运营商或应用开发者将更新推送到用户设备,而用户无需连接到计算机或使用其他外部工具。
简单来说就是平常系统升级的时候,通过无线的方式去下载获得的包。具体 OTA 升级原理是要看这个 android ota 升级原理 3,不过此处我们简单知道概念就好
- Magisk
关于 Magisk 的原理,可以理解为 magisk 是挂载一个与系统文件隔离的文件系统来加载自定义内容,为系统分区打开了一个通往平行世界的入口,所有改动在那个世界(Magisk 分区)里发生,在必要的时候却又可以被认为是(从系统分区的角度而言)没有发生过。
既然跟分区相关,那就得了解下分区是什么
类比 Windows 磁盘的分区,本质上是在磁盘上去划分一段段连续的存储区域,并且按照一定的格式来组织数据。就像 Windows 有启动分区一样,回顾下启动过程:
- CPU 执行 BIOS 初始化、自检等程序,加载磁盘内容到物理内存 0x7c00 处
- 从引导扇区的 Boot 程序开始执行
- ……
安卓本质上也是一个 Linux 系统,启动过程自然也是可以类比,那么这里就不难理解安卓的分区了:
- boot 分区:包含启动加载器需要的所有信息,如内核。
- system 分区:包含 Android 操作系统本身。
- recovery 分区:包含恢复模式的代码,用于更新、备份或恢复系统。
- userdata 分区:包含用户数据和应用程序。
- cache 分区:用于存储临时数据和 OTA 更新。
这些信息往往写在磁盘最开的几个 KB 中,如果你了解 mbr、gpt 等磁盘分区表,就不难理解了
在 Windows 上可以通过 WinHex 直接查看启动分区的内容,那么安卓如何操作呢?
可以通过 dd 命令:
adb shell su -c "dd if=/dev/block/bootdevice/by-name/boot_a of=/sdcard/boot.img"
adb pull /sdcard/boot.img
由于现在安卓系统支持 A/B 分区方案,即有两个独立的系统分区, boot_a
和 boot_b
,这样的设备可以在一个分区上运行系统,同时在另一个分区上进行后台更新,然后在下一次重启时切换到新的分区,从而实现无缝的系统更新。
注:本质上 Linux 一切皆文件,boot_a 实际指向的是 /dev/block 下的设备文件
redfin:/ # ls -al /dev/block/bootdevice/by-name/boot_a
lrwxrwxrwx 1 root root 15 1970-01-04 03:33 /dev/block/bootdevice/by-name/boot_a -> /dev/block/sda6
那么这里 Magisk 要做什么也就呼之欲出了,本质上就是提取 boot.img
的内容,然后给它打 patch,实现一个 Magsik 的分区
- bootloader
如果还记得操作系统启动流程,那么 bootloader 实际上一个很重要的功能就是初始化内存、加载磁盘的引导分区。所以只要能进入 bootloader
界面,那么手机大概率都是有救的
adb reboot bootloader
- fastboot
fastboot
类似于 adb,可以与设备的 bootloader 通信。主要用来解锁,以及刷入
注意设备必须处于 bootloader 模式(也称为 fastboot 模式)才可以使用 fastboot
常用的 fastboot
命令:
-
fastboot devices
:列出连接到计算机的设备 -
fastboot flash [partition] [filename]
:刷写指定的分区。例如,要刷写 recovery 分区:
fastboot flash recovery recovery.img
-
fastboot boot [kernel] [ramdisk]
:不直接刷写到设备,而是仅从给定的内核 /ramdisk 引导 -
fastboot erase [partition]
:擦除指定的分区 -
fastboot oem unlock
:解锁设备的 bootloader
安装 Magisk#
大体上来说可以分为几个步骤
- 解锁 bootloader
- patch boot.img
- 刷入 patch 后的 boot.img
- 通过 Magisk Manage 安装 Magisk
第一步要看手机品牌而定,Google 在这一块还算是比较开放的
同时,Pixel 最好的一点就是,官网已经提供好了设备的 image: 下载链接
只需要确定好手机版本号即可(不像小米,还需要有积分才能申请到开发版)
下载好,解压找到 boot.img
,传入手机,通过 Magisk Manage 打 patch,导出。
从 patch 后的 img 启动,这个操作一般是没有风险的,如果直接 覆盖则可能出问题(不过问题也不太大)
fastboot boot magisk_patched-26100_nRGcd.img
Sending 'boot.img' (98304 KB) OKAY [ 2.521s]
Booting (bootloader) boot.img missing cmdline or OS version
OKAY [ 1.577s]
Finished. Total time: 4.145s
启动之后,此时就能临时获得 root 权限。当然重启后就会失效,因为重启后还是从原来的 boot.img
启动
这时候可以通过 Magisk Manage 刷入即可,这种方式相对来说更加安全
问题回顾#
后来回顾了下,原来是这个问题:
也有一些其他的解决方案,如关闭验证等,但是我尝试了没啥用就没管了
Magisk 模块推荐(内空)#
本来是应该要推荐一些的 Magisk 模块的,奈何我已经很少用安卓了,安装 Magisk 的目的也就是为了 root 而已🤣
参考#
玩机的必备操作 —— Pixel3 安装 Magisk
[已解决] Pixel 4 刷入 Magisk 在 fastboot 模式下找不到设备 和如何救砖
[原创] 云手机底层技术揭密 : Android 系统启动与 Magisk 原理
[原创] Magisk 学习之刷入 vbmeta.img 及关闭 avb2.0 校验