跳至主要内容

LG V35 刷 LineageOS(下):EDL 寫入 Recovery、裝好 22.2

· 閱讀時間約 11 分鐘

上集把 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
LineageOS22.2-20261015-nightly
GAppsMindTheGapps-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)
/data46G,可用 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.zipd63ab736官方 API ✅
boot.img(Lineage Recovery)fa4c4eb7官方 API ✅
MindTheGapps-15.0.0-arm64-20260915_032013.zipe979601eGitHub release 的 digest ✅
copy-partitions-20220613-signed.zip92f03b54上集下載時記下的值 ✅

官方 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​

趁它重開的時候:

  1. 按住音量下+電源
  2. 出現 LG 標誌時,放開電源約 1 秒再按住(音量下全程不放)
  3. 出現 LG 的「Factory data reset」確認畫面,用音量鍵選 Yes、電源鍵確認,要確認兩次

這個畫面寫著「Delete all user data」,看起來很嚇人,但官方說明有寫:這裡選 Yes 不會真的清資料,而是進到剛寫入的 Recovery。

LG 的 Factory data reset 第二次確認「Select Yes to delete」,選 Yes 其實是進 Recovery

第一次進到 LineageOS Recovery 22.2 的主選單

這時 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)。

copy-partitions 執行中,逐一列出 Partition xxx_b 和 dd 的複製紀錄(13:23)

copy-partitions 完成:Install completed with status 0(13:24)

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

Recovery 的 Advanced 選單,選 Reboot to recovery

Format data​

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

Format user data 的確認畫面(13:27)

格式化完成:Formatting /data、/metadata,Data wipe complete(13:28)

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 之後才裝,才會裝到新系統所在的槽。

LineageOS 安裝完成,詢問是否重開 Recovery,選 Yes;下方可以看到驗證 result 0 和 Step 1/2、2/2

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。

MindTheGapps 簽章驗證失敗的提示「Install anyway?」,選 Yes

MindTheGapps 安裝完成:Done!、Install completed with status 0(13:44)

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 秒。

LineageOS 第一次開機的動畫(13:45:42)

設定精靈「Hi there」(13:46:17)

刷完的結果​

項目原廠 Android 10LineageOS 22.2
Android 版本10(API 29)15(API 35)
安全性修補2020-04-012026-10-01
系統版本QKQ1.191222.002(30e)22.2-20261015-NIGHTLY-judyp
開機槽ba
已安裝套件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 個。可用空間變多也主要是因為資料全清了,不是系統變小。

DevCheck 的系統頁:LG V35 ThinQ、lineage_judyp、Android 15 (Vanilla Ice Cream)

Hi-Fi Quad DAC​

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

Quad DAC 設定頁,沒插耳機時開關是灰色

插上有線耳機後打開 Quad DAC,下面的選項都可以調整

用耳機聽起來聲音正常,沒有雜音或爆音。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),我自己沒有套用,維持原生解析度。

DevCheck 儀表板:CPU 34°C、GPU 32°C、Adreno 630、2880×1440 60Hz

退路​

萬一要回原廠 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,等到我手癢按了中斷,結果手機早就裝好了。

參考資料​