安卓手机root二三事
起因是这样的,很久之前(大概1年前吧),有一部Google Pixel5手机,是拿来做测试的。自然是少不了折腾,magisk、太极等都安排上。结果在一次操作失误后,把手机重置了。于是又只能重来一遍,结果在刷入Magisk的时候失败了,导致手机无限重启,当时还挺后悔,想着用不了了,后来就晾在一边没管了。
结果上周,心血来潮给手机充了个电,居然又能用了?时间居然真的可以修复bug吗🤣
https://twitter.com/rayepeng_/status/1691006785803673600?s=20
安卓这块确实不是很熟,于是决定恶补一下这里的知识
一些概念
- 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_alrwxrwxrwx 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.imgSending 'boot.img' (98304 KB) OKAY [ 2.521s]Booting (bootloader) boot.img missing cmdline or OS versionOKAY [ 1.577s]Finished. Total time: 4.145s启动之后,此时就能临时获得root权限。当然重启后就会失效,因为重启后还是从原来的 boot.img 启动
这时候可以通过Magisk Manage刷入即可,这种方式相对来说更加安全
问题回顾
后来回顾了下,原来是这个问题:
https://twitter.com/rayepeng_/status/1691376215285010434
也有一些其他的解决方案,如关闭验证等,但是我尝试了没啥用就没管了
Magisk模块推荐(内空)
本来是应该要推荐一些的Magisk模块的,奈何我已经很少用安卓了,安装Magisk的目的也就是为了root而已🤣
参考
玩机的必备操作 —— Pixel3 安装 Magisk [已解决]Pixel 4刷入Magisk在fastboot模式下找不到设备 和如何救砖 [原创] 云手机底层技术揭密 : Android系统启动与Magisk原理 [原创] Magisk学习之刷入vbmeta.img及关闭avb2.0校验