LG V35 刷 LineageOS(下):EDL 寫入 Recovery、裝好 22.2
上集把 LG V35 升到原廠 Android 10(30e),這集接著刷 LineageOS 22.2(Android 15)。官方教學要先 root 再用 dd 寫 Recovery,我手上已經有能用的 EDL 環境,所以改用 EDL 直接寫,不用 root。
從 EDL 寫入 Recovery(13:16)到看到設定精靈(13:46)約 30 分鐘,真正寫入只花了 14 秒,其他時間都在 Recovery 裡按選單、等 sideload。
這是我在「一支手機」上的實作紀錄,不是保證成功的教學。刷機會清除手機裡的所有資料,也拿不到原廠保固。請自行承擔風險,並先讀完上集的備份和 Android 10 步驟。
適用範圍
| 項目 | 本文的環境 |
|---|---|
| 手機型號 | LG V35 ThinQ LM-V350AWM(AT&T 硬體) |
| 開始時的韌體 | AT&T 原廠 Android 10 V350AWM30e,在 b 槽(上集刷入) |
| Bootloader | 已解鎖 |
| 電腦 | macOS,Apple Silicon(arm64) |
| 工具 | 跟上集同一套:bkerler/edl commit 1cda1a6、LG SDM845 firehose |
| LineageOS | 22.2-20261015-nightly |
| GApps | MindTheGapps-15.0.0-arm64-20260915_032013 |
| 日期 | 2026-10-21 |
各步驟的驗證狀態:
| 步驟 | 狀態 |
|---|---|
| 移除 Google 帳號、關掉螢幕鎖定 | ✅ |
| 核對檔案雜湊 | ✅ |
| EDL 寫入 Lineage Recovery 並讀回比對 | ✅ |
| 進入 Lineage Recovery | ✅ |
| copy-partitions | ✅ |
| Format data | ✅ |
| sideload LineageOS 22.2 | ✅ |
| sideload MindTheGapps | ✅ |
| 第一次開機、Wi-Fi、Quad DAC | ✅ |
| 從 LineageOS 刷回 Android 10 | ⏳ 腳本還留著,但還沒實際走過 |
刷機前的準備
移除 Google 帳號和螢幕鎖定
官方安裝說明要求先移除所有 Google 帳號,避免格式化後觸發出廠重設保護(FRP),開機時被要求登入原本的帳號。
- 設定 → 使用者與帳戶,把 2 個 Google 帳號都移除。用 adb 確認:
adb shell dumpsys account | grep -c "type=com.google}" # 0
- 螢幕鎖定從「圖案」改成「無」。第一次我在選單裡沒找到,後來從「鎖定螢幕與安全 → 選擇螢幕鎖定」進去,畫完原本的圖案才出現「無」。改完用這行確認:
adb shell locksettings verify
# 還有鎖定時:Credential can't be null or empty
# 已經沒有鎖定:Lock credential verified successfully
這支是我手上唯一的 Android 10,所以刷之前先把自己開發的 App 在 Android 10 上的測試跑完,刷完就沒得測了。
刷機前的數據
13:12 用 adb 讀的,最後拿來跟刷完的結果比:
| 項目 | 值 |
|---|---|
| Android 版本 | 10(API 29) |
| 安全性修補 | 2020-04-01 |
| 開機槽 | b |
| 已安裝套件 | 322 個(系統 273、第三方 49) |
| /data | 46G,可用 20G |
核對檔案
檔案在上集就下載好了,下面都放在 ~/LG-V35-lineage 這個資料夾(跟上集的 ~/LG-V35-backup、~/LG-V35-work 同一套命名,換成你自己的路徑即可)。刷之前再確認一次有沒有更新的版本,順便重新比對雜湊。LineageOS 的版本清單和每個檔案的 SHA-256 可以直接從官方 API 拿:
curl -sL https://download.lineageos.org/api/v2/devices/judyp/builds
最新的仍是 10/15 的 nightly(大約一週出一版)。
| 檔案 | SHA-256(前 8 碼) | 比對對象 |
|---|---|---|
| lineage-22.2-20261015-nightly-judyp-signed.zip | d63ab736 | 官方 API ✅ |
| boot.img(Lineage Recovery) | fa4c4eb7 | 官方 API ✅ |
| MindTheGapps-15.0.0-arm64-20260915_032013.zip | e979601e | GitHub release 的 digest ✅ |
| copy-partitions-20220613-signed.zip | 92f03b54 | 上集下載時記下的值 ✅ |
官方 API 也列了 dtbo.img、vbmeta.img,雜湊一樣相符,但官方步驟只要求寫 boot.img,這兩個沒有用到。
用 EDL 寫入 Lineage Recovery
官方的做法是先 root,再在手機上用 dd 把 boot.img 寫進 boot_a、boot_b。我改成在 EDL 裡用 edl 寫,效果一樣,好處是不用為了這一步先裝 Magisk。
先確認大小對得上:上集讀分區表時,boot_a、boot_b 都在 LUN4,各 16384 個磁區 × 4096 bytes=67,108,864 bytes,跟官方的 boot.img 大小完全一樣。
實際執行的指令如下。我是把它們包在一個「等 EDL 出現才開始」的腳本裡跑,進 EDL 的按法跟上集一樣;腳本裡第 3 步是用迴圈逐一比對雜湊,這裡改寫成一行 shasum 方便看:
cd edl
PY=../venv/bin/python
LOADER=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin
IMG=~/LG-V35-lineage/boot.img
RB=~/LG-V35-backup/readback_20261021_131516
# 1. 兩個槽都寫入 Lineage Recovery
"$PY" edl.py w boot_a,boot_b "$IMG","$IMG" --memory=ufs --lun=4 --loader="$LOADER"
# 2. 讀回來
mkdir -p "$RB"
"$PY" edl.py r boot_a,boot_b "$RB/boot_a.bin","$RB/boot_b.bin" --memory=ufs --lun=4 --loader="$LOADER"
# 3. 跟 boot.img 比對(兩個都要是 fa4c4eb7 開頭)
shasum -a 256 "$IMG" "$RB/boot_a.bin" "$RB/boot_b.bin"
# 4. 重開
"$PY" edl.py reset --loader="$LOADER"
紀錄:
13:16:18 EDL detected
Writing to physical partition 4, sector 65286, sectors 16384
Writing to physical partition 4, sector 163830, sectors 16384
13:16:26 write exit=0
13:16:31 readback exit=0
13:16:31 OK boot_a.bin
13:16:31 OK boot_b.bin
13:16:32 reset exit=0
寫入的起始磁區 65286、163830,跟上集備份時讀到的 boot_a、boot_b 位置一樣。最後 reset 之後 edl 會印出 USBError(5, 'Input/Output Error'),那是手機重開、USB 斷掉,不是錯誤。
重開之後手機一直重開機。因為 boot 已經換成 Lineage Recovery,system 還是原廠 Android 10,兩個對不上,這是預期中的,接著進 Recovery 就好。
進入 Lineage Recovery
趁它重開的時候:
- 按住音量下+電源
- 出現 LG 標誌時,放開電源約 1 秒再按住(音量下全程不放)
- 出現 LG 的「Factory data reset」確認畫面,用音量鍵選 Yes、電源鍵確認,要確認兩次
這個畫面寫著「Delete all user data」,看起來很嚇人,但官方說明有寫:這裡選 Yes 不會真的清資料,而是進到剛寫入的 Recovery。


這時 adb devices 顯示 unauthorized,因為手機資料還是加密的,Recovery 讀不到 adb 的授權金鑰。之後用的 sideload 模式不需要授權,不影響。
copy-partitions
官方說明的理由是:沒在用的那個槽可能是空的,或是放著比較舊的韌體,可能造成問題甚至變磚,所以先把使用中的槽整個複製過去。我的 a 槽放的是上集留下的 Pie 20f,這一步會把它蓋掉。
手機上選 Apply update → Apply from ADB,電腦端:
cd ~/LG-V35-lineage
adb -d sideload copy-partitions-20220613-signed.zip
13:23:21 開始,13:23:58 結束,電腦端最後是 Total xfer: 1.00x,手機端顯示 Install completed with status 0.。執行中可以看到它一個一個分區用 dd 複製(Partition xxx_b)。


做完照官方步驟從 Advanced → Reboot to recovery 重開一次 Recovery。

Format data
Factory reset → Format data/factory reset,會跳出「THIS CANNOT BE UNDONE!」,選 Format data。這一步會清掉內部儲存空間的所有檔案,照片之類的要事先備份。


sideload LineageOS 22.2
一樣 Apply update → Apply from ADB,電腦端:
adb -d sideload lineage-22.2-20261015-nightly-judyp-signed.zip
檔案約 990 MB。手機上先驗證簽章,Update package verification took 46.4 s (result 0),接著 Step 1/2、Step 2/2,13:32 跳出「To install additional packages, you need to reboot recovery first」。
這段電腦端看起來很久沒動靜,我等不下去就把指令中斷了(不建議學),結果手機那邊早就裝好了。看到這個詢問畫面就代表安裝完成,要裝 GApps 就選 Yes,GApps 必須在重開 Recovery 之後才裝,才會裝到新系統所在的槽。

sideload MindTheGapps
重開 Recovery 後,畫面上方的 Active slot 從 b 變成 a,也就是 LineageOS 裝進去的槽。再 Apply update → Apply from ADB:
adb -d sideload MindTheGapps-15.0.0-arm64-20260915_032013.zip
這次手機會跳出「Signature verification failed, Install anyway?」,下面還有三行紅字 ERROR。因為 Lineage Recovery 只認 LineageOS 自己的簽章,MindTheGapps 是另一個團隊簽的,一定會出現。檔案在前面已經跟 GitHub 上的 digest 比對過,選 Yes。


13:42:17 開始,13:44:01 結束。電腦端的進度會停在 47% 左右,最後才跳到 Total xfer: 1.00x,copy-partitions 那次也一樣,等它跑完就好。
第一次開機
選 Reboot system now。原本以為第一次開機要等好幾分鐘,結果 13:45:42 出現開機動畫,13:46:17 就看到設定精靈的「Hi there」,大約 35 秒。


刷完的結果
| 項目 | 原廠 Android 10 | LineageOS 22.2 |
|---|---|---|
| Android 版本 | 10(API 29) | 15(API 35) |
| 安全性修補 | 2020-04-01 | 2026-10-01 |
| 系統版本 | QKQ1.191222.002(30e) | 22.2-20261015-NIGHTLY-judyp |
| 開機槽 | b | a |
| 已安裝套件 | 322 個 | 242 個(全部是系統套件) |
| /data 可用空間 | 20G(共 46G) | 43G(共 45G) |
| Wi-Fi | 正常 | 正常 |
| 基頻 | 有 | 有,2.9-00088-SDM845_GEN_PACK-1.258214.1.258952.1 |
原廠時的 322 個裡有 49 個是我自己裝的 App,刷機時跟著資料一起清掉;系統套件從 273 個變成 242 個。可用空間變多也主要是因為資料全清了,不是系統變小。

Hi-Fi Quad DAC
LineageOS 有自己的 Quad DAC 設定頁,選項有 HiFi 模式、AVC 音量、數位濾波器、自訂濾波係數和左右平衡。沒插耳機時開關是灰色的,插上有線耳機後才能打開。


用耳機聽起來聲音正常,沒有雜音或爆音。LineageOS 可以手動直接開高阻抗模式,切過去音質聽得出差別。
沒有「螢幕解析度」選項
原廠系統可以在設定裡切換螢幕解析度,LineageOS 的設定裡找不到。查了一下,這塊螢幕回報給系統的只有一種顯示模式:
adb shell dumpsys display | grep DisplayModeRecord
# DisplayModeRecord{mMode={id=1, width=1440, height=2880, fps=60.000004, vsync=60.000004, synthetic=false, alternativeRefreshRates=[], supportedHdrTypes=[2, 3]}}
所以原廠的解析度切換應該是 LG 自己用軟體做的縮放。真的想省電,可以用 adb shell wm size 1080x2160 和 adb shell wm density 420 做到類似效果(改回來用 wm size reset、wm density reset),我自己沒有套用,維持原生解析度。

退路
萬一要回原廠 Android 10,上集的 30e 映像和寫入腳本都還在:在 EDL 裡把 30e 寫回 b 槽(包含 boot_b,會蓋掉 Lineage Recovery)、切回 b 槽,再清除 userdata。這條路我還沒有實際走過,所以上面的狀態表標成 ⏳。
要回 Pie 9 就麻煩了:copy-partitions 已經把 a 槽的 Pie 韌體蓋掉,上集的備份只有韌體和 boot,沒有 Pie 的 system、vendor,要靠 NAS 上那份 20f 的 KDZ。
上集最花時間的是進 EDL,這集真正的寫入只有 14 秒,最難熬的反而是等 sideload,等到我手癢按了中斷,結果手機早就裝好了。