起因是這樣的,很久之前(大概 1 年前吧),有一部 Google Pixel5 手機,是拿來做測試的。自然是少不了折騰,magisk、太極等都安排上。結果在一次操作失誤後,把手機重置了。於是又只能重來一遍,結果在刷入 Magisk 的時候失敗了,導致手機無限重啟,當時還挺後悔,想着用不了了,後來就晾在一邊沒管了。
結果上週,心血來潮給手機充了個電,居然又能用了?時間居然真的可以修復 bug 嗎🤣
原来时间真的可以修复bug?🤣 之前给手里的一台Google pixel手机刷机失败,没法启动了,以为变砖了就没管了 过了3、4个月 今天随手拿了冲了个电,没想到居然自己好了???
安卓這塊確實不是很熟,於是決定惡補一下這裡的知識
一些概念#
- 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 刷入即可,這種方式相對來說更加安全
問題回顧#
後來回顧了下,原來是這個問題:
我知道问题了,原来是之前刷的boot_patched.img 有问题,导致手机无限重启,其实把原版的boot.img刷入就能解决问题了
也有一些其他的解決方案,如關閉驗證等,但是我嘗試了沒啥用就沒管了
Magisk 模塊推薦(內空)#
本來是應該要推薦一些的 Magisk 模塊的,奈何我已經很少用安卓了,安裝 Magisk 的目的也就是為了 root 而已🤣
參考#
玩機的必備操作 —— Pixel3 安裝 Magisk
[已解決] Pixel 4 刷入 Magisk 在 fastboot 模式下找不到設備 和如何救磚
[原創] 雲手機底層技術揭密 : Android 系統啟動與 Magisk 原理
[原創] Magisk 學習之刷入 vbmeta.img 及關閉 avb2.0 校驗