2020年9月7日 星期一

android 最重要的幾個分割區及三大開機模式

上個星期手機重刷好幾次, 慢慢從昏頭轉向的逐步操作學習模式整理出一些觀念性的心得, 趕快趁記憶猶新記下爬文網址與心得。 本文的重點不是步驟, 而是解說 (希望可以) 適用於多數廠牌型號的 「分割區」 與 「模式」 這兩個觀念。 本文假設你粗略熟悉 linux 的分割區及開機流程概念 (vmlinuz、 initrd、 root file system) 如果對以下幾篇我的舊文的主題有一點概念, 會有點幫助 (但並非必須):

  1. extlinux 啟動系統的步驟
  2. 要或不要 root/越獄/刷機的理由
  3. Root/刷機之前的知識補給站

建議可以細讀本篇觀念文, 然後從 這裡 這裡 列出的多款 custom ROMs 當中挑一個, 屆時再根據你的手機型號及選擇的 ROM 去搜尋/爬其他教學文, 希望 root/刷機的過程可以因此順利很多、 少走冤枉路。

android 手機三種模式

一、 分割區

Android 手機的ROM/硬碟切成很多個分割區。 檢視方法 (需要 su 變身成 root): cat /proc/partitionsls -l /dev/block/bootdevice/by-name/ 我的手機看到幾十個分割區, 嚇死人了~ 簡化地說, 最重要的有以下幾部分:

  1. boot loader 分割區: 最最最重要的開機分割區, 如果毀了, 以我的程度來看, 手機就變磚塊了。
  2. recovery: 救援用的分割區, 存放精簡版的 android 作業系統。
  3. system 分割區: 平時正常使用的 android 作業系統分割區, 有完整的功能。
  4. data 分割區: 存放用戶資料的地方; 如果沒有 root、 沒有安裝 busybox 等等, adb 跟檔案總管所能自由讀寫的大約就只有這一部分。

更詳細的各分割區解說: Android File Hierarchy : System Structure Architecture Layout Development of Flashable Space-Xtend™ Script for Android Firmware

從 Android 8 開始, 改成 A/B slots 配置, 原本的 [recovery] vs [system] 變成 [boot_a+system_a] vs [boot_b+system_b], 也就是說從這個版本開始, 就沒有 「recovery 分割區」; recovery 模式 (下詳) 的程式碼 直接放在完整系統模式的 boot 分割區 Android A/B System OTA 分析 的圖畫得很棒, 借來貼在這裡; 其中 「系统的典型场景」 那一節也解釋了刷機時 A/B 之間的 (可能會自動?) 切換過程。 你的手機硬體支援 A/B 模式嗎? 可以在 bootloader 模式 (下詳) 底下, 從電腦透過 usb 連線用 fastboot getvar all 查看有沒有很多關於 slot 的資訊。

傳統分割方式 vs A/B 分割方式

二、 開機模式

開機模式有三種:

  1. boot loader 模式: 最陽春的模式 (svg 插圖中用單層外框表示), 只要 boot loader 分割區沒壞、 可以開機進入此模式, 手機就還有機會救起來。 此時若與電腦用 usb 連線, 可以從電腦上透過 fastboot 指令操作手機。 兩者之間的通訊協定也稱為 fastboot。 所以爬文時常常看到 "boot loader mode" 跟 "fastboot mode" 兩詞交替使用。 此時電腦可以對手機做一些 (其它模式下做不到的) 改變權限的事 (例如 unlock、 切換 A/B slot) 但無法對它做太複雜的事 (例如餵 .zip 檔擴充套件包給它吃)。 這個模式的最常用功能就是接受電腦的 fastboot flash xxx.img 指令 (我猜它可能暴力地採用 dd?) 刷入 recovery 的映像檔。
  2. recovery 模式: 救援模式 (svg 插圖用雙層外框表示), 有稍多的程式碼, 例如可以接受 adb sideload xxx.zip。 LineageOS 的 recovery 模式甚至還可以從 "advanced" 選單進去啟用 adb 功能, 進而接受完整的 adb 指令。 這個模式的最常用功能就是安裝 normal 模式的完整作業系統 (一個 .zip 檔, 內含 payload.bin, 再拆開來 會看到幾個分割區的 .img 檔), 或是加載 (不太大的) .zip 檔擴充套件包。 補充 (特技表演, 小朋友不要學): 在 TWRP 裡面, 可以刷 img 檔嗎? 從 advanced 選單進 terminal, 先 simg2img 再 dd。 詳見 這個問答
  3. noraml 模式: 一般麻瓜們平時使用的模式 (svg 插圖用三層外框表示)。 開機時先透過 boot 分割區開機, 再進入 system 分割區, 然後卸載 boot 分割區, 有完整的作業系統功能。 但是因為它就站在 system 分割區上面, 所以無法寫入 system 分割區; 如果硬要寫入 (已卸載的) boot 分割區, 可能也會發生中等程度的災難, 下次可能無法正常開機進入 normal 模式! 在這個模式下, 透過 「按七下」 程序, 可以啟用 adb 功能, 接受完整的 adb 指令, 讓麻瓜們踏上學習魔法的第一步。

所以呢, 請參考下表的著色部分, 你在網路上找到的 root/刷機的教學文多半會包含至少以下步驟:

  1. 從 「按七下」 那一格開始啟用 adb, 順便熟悉一下 adb 指令,
  2. 進入 「boot loader 模式」欄「刷 *.img」列。 幸運的話, 可以直接先用 fastboot flashing unlock 解鎖; 但對於某些廠牌的手機來說, 解鎖是一大門學問, 本文沒談。 再來要刷某一個 recovery.img , 可以刷 TWRP , 或是 lineageOS 的 recovery.img , 或是你自選的品牌的 ROM 所附的 recovery.img, 但總之不需要重複刷兩個 recovery。 如果是 TWRP, 按照手機屬於單 slot 或是 A/B slot, 有不同的刷機方式。 我推 lineageOS 的 recovery.img, 因為 TWRP 有時觸控會失效, 需要用 otg 外接滑鼠
  3. 進入 「TWRP recovery」欄「安裝/新增 *.zip」列, 或 「lineageOS recovery」欄「安裝/新增 *.zip」列, 先安裝某品牌的 ROM 所提供的一個很大的 .zip 檔, 也就是刷入 normal 模式的完整系統, 再視需要新增幾個較小的 .zip 檔 (例如 Magisk su 或 Open Google Apps, 見第三節)。
boot loader 模式下TWRP recovery 模式下lineageOS recovery 模式下lineageOS 模式下
查詢 A/B fastboot getvar current-slot reboot 選單 adb shell getprop ro.boot.slot_suffix
切換 A/B fastboot --set-active=_b reboot 選單 沒有人知道
adb shell No No Advanced 選單 按七下
刷 *.img fastboot flash 分割區 檔名.img TWRP 刷 *.img 特技表演 災難
用 *.zip 安裝系統
或新增 *.zip 套件
No install 選單 Apply update 選單 No

本文最上方的 svg 插圖摘要如何用指令從一個模式切換到另一個模式。 根據 這個自問自答, 某些手機的 boot loader 模式認得這個指令: fastboot reboot recovery (進入 recover 模式); 又有另一些手機的 boot loader 模式認得: fastboot reboot twrp.img (從電腦傳一個 *.img 格式的 recover 映像檔給它, 不安裝, 直接載入記憶體並且進入 recovery 模式)。 當然, 在 bootloader 模式下, 總是可以用音量鍵操作選單進入其他兩個模式。 至於在 recovery 模式下, 基本上都用圖形選單操作。 比較有趣的是: (上表中的紅色那一格) LineageOS 的 recovery 模式的 "advanced" 選單裡可以啟用 adb, 這樣電腦那頭就可以下完整的 adb 指令。 對於研究 recovery 模式應該很有幫助。

刷機過程有一些慌亂, 忘記詳細記錄, 有一些事我還是沒有搞懂:

  1. A/B 分割區的手機在 recovery 模式下安裝完整系統時, 到是是裝到同一個 slot 還是隔壁的 slot?
  2. A/B 分割區的手機看起來這樣應該可以同時擁有兩個不同版本的 android? 正確步驟應該是? (我試了幾次, 最終都只有一個完整版加一個 recovery 版)

沒關係, 現在知道了: 以後可以進入 lineageOS recovery 模式的 "enable ADB", 然後參考這篇很棒的觀念文: How A/B Partitions and Seamless Updates Affect Custom Development on XDA 再來深入研究。 關於 fastboot 與 recovery modes 的其他更多文章:

  1. Android Fastboot 与 Recovery 和刷机
  2. FastBoot BootLoader Recovery 模式解释
  3. Android bootloader/fastboot mode and recovery mode explained/Android boot process
  4. Android fastboot 基本用法教學

三、 加載 Google Apps 與 su

有一些特殊功能在某些基本的 system 映象檔裡面沒有, 例如 google apps (含 google play) 及 su (變身成 root 的權限)。 這些功能無法在 normal 模式用 apk 的方式新增到 data 分割區, 所以手機一定要開到 recovery 模式, 以 adb sideload xxx.zip 的方式把一個或多個 (不太大的) zip 檔加載進 system 分割區。 如果這一個或這幾個 (不太大的) zip 檔設計正確、 如果順利的話, 這不應該傷害到已刷進 system 分割區的 (normal 模式) 完整系統。

此外, 「加載」 一事理論上可以在 「刷完整系統」 的同時順便做, 也可以在刷完系統、 用一段時日之後, 再另外做, 並不需要跟它綁在一起。 但是因為 「刷完整系統」 所採用的指令 (adb sideload) 和刷進去的檔案格式 (.zip), 都跟 加載 (不太大的) zip 檔 外觀長得一樣, 而我看過的 (少少幾個) recovery 的介面又都沒有明顯地區分兩者, 還好心地經常叫你一次同時刷好幾個 zip 檔, 所以有點令人困惑。 總之, adb sideload ... 的時候, 如果是決心要刷完整系統順便同時加載, 那一定要先 sideload 那個很大的、 內含 payload 的 zip 檔再加載其他的小 zip 檔; 或者如果手機已用了一陣子, 事後才想加載, 那就千萬不要畫蛇添足重複 sideload 那個很大的內含 payload 的 zip 檔。

最常見的例子就是 OpenGAPPS。 一般自由軟體版的 ROM 都沒有 google play 可用, 所以可能需要加裝 OpenGAPPS。 你可能會注意到: 必須根據你的 CPU 及 ROM 的 android 版本來選擇; 但並不像 ROM 一樣需要細到廠牌型號。 安裝教學文 基本上也很簡單, 跟廠牌型號無關, 因為硬體的問題 android 9 或 android 10 (或你的 ROM 的版本) 作業系統會幫你處理。

至於想要 root, 就更複雜。 LineageOS 17 的這一頁 說: LineageOS 已經不再支援他們的 SU add-on, 而 SuperSU zip 更早以前就已不再維護, 所以現在剩下 Magisk 一途。 How to Root Android Using Magisk 解釋得很詳盡, 好像有一些複雜的狀況; 還好我的 essential ph1 可以很簡單地 adb sideload Magisk*.zip 就成功地 root。

* * * * *

歡迎留言指正 and/or 補充。 最好可以同時提供參考文章超連結。 多一些人有能力堅持手機自主權很重要。 可以讀寫腦波的 Neuralink 已經出現了。 如果它的控制權不在用戶手上, 而在公司的手上 -- 就像未 root 的手機一樣 -- 那會是什麼樣的世界? 如果 root/刷機技術對你而言太硬, 但是你跟我一樣看到高風險的未來, 或許可以考慮寫一篇科幻小說來提醒大家。

2 則留言:

  1. 美國Verizon 版 鎖OEM,這種特製會放在哪個分區阿

    回覆刪除
  2. pixel 手機嗎? 用 「verizon oem unlock」 搜尋到這篇: https://www.xda-developers.com/how-to-unlock-bootloader-verizon-google-pixel-xl-running-android-10/

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。