<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>ttylab80387 · 研究記錄</title>
        <link>https://ttylab80387.com/research/</link>
        <description>技術研究文章，可能是工作上解決的問題或閒暇玩玩的東西</description>
        <lastBuildDate>Mon, 19 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hant</language>
        <item>
            <title><![CDATA[LG V35 刷 LineageOS（上）：備份與升級 Android 10]]></title>
            <link>https://ttylab80387.com/research/lg-v35-lineageos-1/</link>
            <guid>https://ttylab80387.com/research/lg-v35-lineageos-1/</guid>
            <pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[AT&T 版 LG V35 沒有 Android 10 的 KDZ，只能用開源的 edl 工具進 EDL 模式，先完整備份，再把網友讀出的 30e 原廠分區寫進 b 槽。記錄進 EDL 的按法、備份從一口氣讀改成分批讀的過程，以及 30e 實際的 ARB 值。]]></description>
            <content:encoded><![CDATA[<p>手邊有一支 LG V35（LM-V350AWM，AT&amp;T 硬體），之前交叉刷成美版開放版的 Pie 20f。這次想刷 LineageOS 22.2（Android 15）當 App 測試機，但 <a href="https://wiki.lineageos.org/devices/judyp/install/" target="_blank" rel="noopener noreferrer" class="">LineageOS 官方安裝說明</a>要求先裝「最新的原廠 Android 10」，而 AT&amp;T 的 Android 10 只透過 OTA 推送，沒有 KDZ 可以用 LGUP 刷。</p>
<p>最後是用開源的 edl 工具進高通 EDL（9008）模式，先把手機獨有的分區完整備份，再把網友從手機讀出來的 AT&amp;T 30e 原廠分區寫進 b 槽。這篇是上集，寫到 Android 10 開機成功，刷 LineageOS 留到下集。</p>
<!-- -->
<div class="theme-admonition theme-admonition-warning admonition_awr5 alert alert--warning"><div class="admonitionHeading_qgRS"><span class="admonitionIcon_Oc9R"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>免責聲明</div><div class="admonitionContent_zuXe"><p>這是我在「一支手機」上的實作紀錄，不是保證成功的教學。刷寫手機底層分區可能讓手機開不了機（變磚）、遺失 IMEI 或 Wi-Fi 校準資料，也拿不到原廠保固。請自行承擔風險，<strong>動手前先完整備份</strong>，並確認自己的狀況跟下面的「適用範圍」相符。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="適用範圍">適用範圍<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E9%81%A9%E7%94%A8%E7%AF%84%E5%9C%8D" class="hash-link" aria-label="適用範圍的直接連結" title="適用範圍的直接連結" translate="no">​</a></h2>
<table><thead><tr><th>項目</th><th>本文的環境</th></tr></thead><tbody><tr><td>手機型號</td><td>LG V35 ThinQ LM-V350AWM（AT&amp;T 硬體）</td></tr><tr><td>開始時的韌體</td><td>美版開放版 Pie V350ULM20f（ARB00）</td></tr><tr><td>之前刷過的韌體</td><td>AT&amp;T 原廠 → 剛買到時刷成美版開放版 Oreo V350ULM10h（<code>V350ULM10h_00_NAO_US_OP_1130.kdz</code>）→ 後來因為 Roon 的 App 不支援 Android 8，再刷成 Pie 20f</td></tr><tr><td>Bootloader</td><td>已解鎖（本文不含解鎖步驟）</td></tr><tr><td>電腦</td><td>macOS 27.0.1，Apple Silicon（arm64）</td></tr><tr><td>工具</td><td>bkerler/edl commit <code>1cda1a6</code>（2026-09-19）、Python 3.14.6、libusb 1.0.30</td></tr><tr><td>日期</td><td>2026-10-19</td></tr></tbody></table>
<p>沒測試過、不保證適用：</p>
<ul>
<li class="">其他 V35 型號（LM-V350N 韓版、LM-V350ULM、LM-V350EAW…）：分區表可能不同，已知韓版和美版的分區大小不一樣</li>
<li class="">從 AT&amp;T 原廠韌體、Oreo、韓版韌體開始</li>
<li class="">Windows／Linux 電腦、其他版本的 edl</li>
<li class="">還沒解鎖的手機</li>
</ul>
<p>各步驟的驗證狀態：</p>
<table><thead><tr><th>步驟</th><th>狀態</th></tr></thead><tbody><tr><td>工具準備</td><td>✅ 已在真機驗證</td></tr><tr><td>進入 EDL</td><td>✅（成功率看手感，我試了很多次）</td></tr><tr><td>讀分區表</td><td>✅</td></tr><tr><td>完整備份（做法）</td><td>✅；整理後的 <code>read_lun</code> 指令 🧪</td></tr><tr><td>驗證備份腳本</td><td>✅（已用實際備份執行）</td></tr><tr><td>寫入前自我檢查腳本</td><td>✅（已用實際分區表和 30e 映像執行）</td></tr><tr><td>寫入 b 槽（做法）</td><td>✅；整理後的 <code>write_lun</code> 指令 🧪</td></tr><tr><td>Android 10 開機</td><td>✅</td></tr><tr><td>LineageOS</td><td>⏳ 下集</td></tr></tbody></table>
<p>✅ 是在上面的環境實際執行並成功；🧪 是指令語法和參數已經用假的 edl 乾跑測試過，跟實際執行時一致，但這份整理後的指令本身還沒接真機跑過；⏳ 是還沒做。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="目標與限制">目標與限制<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E7%9B%AE%E6%A8%99%E8%88%87%E9%99%90%E5%88%B6" class="hash-link" aria-label="目標與限制的直接連結" title="目標與限制的直接連結" translate="no">​</a></h2>
<ul>
<li class="">目標：LineageOS 22.2，保留 Hi-Fi Quad DAC</li>
<li class="">用途：App 測試機，只用 Wi-Fi，沒有 SIM</li>
<li class="">工具只用開源、看得到原始碼的版本。之前下載過假的「修改版 LGUP」，結果帳號被盜，這次不想再賭</li>
<li class="">每一步寫入前先完整備份</li>
<li class="">不覆蓋手機獨有的分區：persist、ftm、modemst1/2、fsg、fsc 等</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="手機現況">手機現況<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E6%89%8B%E6%A9%9F%E7%8F%BE%E6%B3%81" class="hash-link" aria-label="手機現況的直接連結" title="手機現況的直接連結" translate="no">​</a></h2>
<p>2026-10-19 用 adb 讀到的：</p>
<table><thead><tr><th>項目</th><th>值</th></tr></thead><tbody><tr><td>ro.boot.vendor.lge.model.name</td><td>LM-V350AWM</td></tr><tr><td>ro.vendor.lge.swversion</td><td>V350AWM20f</td></tr><tr><td>ro.vendor.lge.factoryversion</td><td>LMV350AT-00-V20f-LAO-COM-FEB-18-2020-ARB00+0</td></tr><tr><td>對應的 KDZ</td><td>V350ULM20f_00_NAO_US_OP_0218.kdz</td></tr><tr><td>ro.boot.verifiedbootstate</td><td>orange（已解鎖）</td></tr><tr><td>ro.boot.slot_suffix</td><td>_a</td></tr><tr><td>root</td><td>無</td></tr><tr><td>電池（用 charge counter 估）</td><td>約 2,350／3,300 mAh，約 71%</td></tr></tbody></table>
<p>Bootloader 是 2024 年照 Nemo 社區的教學，用 EDL 加工程版 abl 解鎖的，當時用的 firehose 檔還留在 NAS 上。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="工具準備">工具準備<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E5%B7%A5%E5%85%B7%E6%BA%96%E5%82%99" class="hash-link" aria-label="工具準備的直接連結" title="工具準備的直接連結" translate="no">​</a></h2>
<div class="language-sh codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-sh codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 開源 EDL 工具（GPL-3.0）</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">git clone --depth 1 https://github.com/bkerler/edl.git   # commit 1cda1a6</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">python3 -m venv venv &amp;&amp; ./venv/bin/pip install -r edl/requirements.txt</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 只抓需要的 LG SDM845 firehose</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">curl -L -o edl/Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  https://raw.githubusercontent.com/bkerler/Loaders/main/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin</span><br></div></code></pre></div></div>
<ul>
<li class="">安裝前先看過 edl 的相依套件和網路呼叫：只有附屬工具會連網，主程式不會</li>
<li class="">firehose 核對了兩件事：git blob 雜湊和 GitHub 上一致（<code>2ed52868…</code>）；SHA-256 是 <code>82808c5e…1da13</code>，跟 2024 年解鎖時用的 <code>prog_ufs_firehose_Sdm845_lge.elf</code> 完全相同</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="為什麼不能直接用-lgup">為什麼不能直接用 LGUP<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E7%82%BA%E4%BB%80%E9%BA%BC%E4%B8%8D%E8%83%BD%E7%9B%B4%E6%8E%A5%E7%94%A8-lgup" class="hash-link" aria-label="為什麼不能直接用 LGUP的直接連結" title="為什麼不能直接用 LGUP的直接連結" translate="no">​</a></h2>
<table><thead><tr><th>檔案</th><th>跟手機相不相符</th><th>格式</th><th>LGUP 能不能刷</th></tr></thead><tbody><tr><td>V350AWM30e.zip（Android 10）</td><td>✅ 同硬體</td><td>網友從手機讀出的分區映像包</td><td>❌ 只能用 EDL 一個一個寫</td></tr><tr><td>V350ULM20f KDZ（Pie）</td><td>✅ 手機原本的韌體</td><td>LG 官方 KDZ</td><td>✅ 救機用</td></tr><tr><td>V350N 30a／30d KDZ（Android 10）</td><td>⚠️ 韓版</td><td>KDZ</td><td>要用修改版 LGUP 的 PARTITION DL</td></tr></tbody></table>
<p>有同型號的官方 KDZ 時，用 LGUP 的 Upgrade 模式就等於官方更新，風險低。AWM 沒有 Android 10 的 KDZ，所以只能走 EDL。</p>
<p>另外要注意，KDZ 本身就<strong>包含</strong> persist、ftm、mpt 這些映像（飞羽 ROM 從韓版 KDZ 抽出的檔案裡就看得到），PARTITION DL 如果全選，會用 KDZ 裡的內容蓋掉手機原本的。不在 KDZ 裡的只有 modemst1/2、fsg。</p>
<p>研究過但沒採用的兩條路：</p>
<ul>
<li class=""><a href="https://www.link-nemo.com/u/10001/post/260876" target="_blank" rel="noopener noreferrer" class="">飞羽 ROM</a>（Nemo 社區的韓版 30a／30c 卡刷包）：讀了它的 update-binary，發現會用 dd 覆蓋 persist、ftm、mpt、misc、persdata 這些手機獨有的分區，不用</li>
<li class="">韓版 V350N 30d KDZ：要用修改版 LGUP，而且有人回報刷到美版後 Wi-Fi、網路壞掉，不用</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="下載的韌體">下載的韌體<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E4%B8%8B%E8%BC%89%E7%9A%84%E9%9F%8C%E9%AB%94" class="hash-link" aria-label="下載的韌體的直接連結" title="下載的韌體的直接連結" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="att-v350awm30eandroid-10分區包">AT&amp;T V350AWM30e（Android 10）分區包<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#att-v350awm30eandroid-10%E5%88%86%E5%8D%80%E5%8C%85" class="hash-link" aria-label="AT&amp;T V350AWM30e（Android 10）分區包的直接連結" title="AT&amp;T V350AWM30e（Android 10）分區包的直接連結" translate="no">​</a></h3>
<ul>
<li class="">來源：XDA 上 jacob019 分享的「<a href="https://xdaforums.com/t/v350awm30e-att_us-stock-rooted-partitions.4322737/" target="_blank" rel="noopener noreferrer" class="">V350AWM30e ATT_US stock &amp; rooted partitions</a>」</li>
<li class="">3,698,834,161 bytes，SHA-256 <code>cb962c92…f876</code>，<code>unzip -t</code> 沒有錯誤</li>
<li class="">裡面沒有任何 Windows 執行檔：<code>partitions/</code> 是原廠分區，<code>modified/</code> 是改過的 boot、dtbo、vendor（Magisk、TWRP、關 verity），另外還有 <code>sources/</code>、<code>notes.txt</code>、<code>load.sh</code></li>
<li class="">vendor 指紋 <code>lge/judyp_lao_com/judyp:10/QKQ1.191222.002</code>，安全性更新 2020-04-01</li>
</ul>
<p>讀完 notes 和討論串記下的重點：</p>
<ul>
<li class="">作者只寫 <strong>b 槽</strong>，a 槽留著當退路</li>
<li class=""><code>OP.bin</code>（650 MB）比手機的 OP 分區（450 MB）大，不能刷</li>
<li class=""><code>persist.bin</code> 是作者手機的校準資料，絕對不能刷</li>
<li class="">有人回報 modified 的 boot 讓手機變磚，所以只用原廠映像</li>
<li class="">ARB（防降級）值從映像字串讀不到；間接證據是 <a href="https://xdaforums.com/t/v350awm30e-android-10-stuck-in-fastboot-no-recovery.4790905/" target="_blank" rel="noopener noreferrer" class="">XDA 有人從 30e 刷回 Pie 20f 成功</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="lineageos-官方檔案">LineageOS 官方檔案<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#lineageos-%E5%AE%98%E6%96%B9%E6%AA%94%E6%A1%88" class="hash-link" aria-label="LineageOS 官方檔案的直接連結" title="LineageOS 官方檔案的直接連結" translate="no">​</a></h3>
<p>全部核對過官方的 SHA-256：</p>
<ul>
<li class="">lineage-22.2-20261015-nightly-judyp-signed.zip</li>
<li class="">boot.img（Lineage Recovery）、dtbo.img、vbmeta.img</li>
<li class="">MindTheGapps-15.0.0-arm64-20260915_032013.zip</li>
<li class="">copy-partitions-20220613-signed.zip（SignApk 簽章）</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="救機用">救機用<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E6%95%91%E6%A9%9F%E7%94%A8" class="hash-link" aria-label="救機用的直接連結" title="救機用的直接連結" translate="no">​</a></h3>
<p>NAS 上留著兩個 KDZ：V350ULM20f（Pie 20f，跟手機現在一樣）和 V350ULM10i（Oreo）。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="進入-edl9008">進入 EDL（9008）<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E9%80%B2%E5%85%A5-edl9008" class="hash-link" aria-label="進入 EDL（9008）的直接連結" title="進入 EDL（9008）的直接連結" translate="no">​</a></h2>
<p>這是花最多時間的一步。失敗的嘗試：</p>
<table><thead><tr><th>嘗試</th><th>結果</th><th>USB（vid<!-- -->:pid<!-- -->）</th></tr></thead><tbody><tr><td><code>adb reboot edl</code></td><td>進 LG Download 模式，LG 把它導向 LAF（無效）</td><td>1004:633A</td></tr><tr><td>按住電源＋音量下，黑屏時「放開」再連按音量上</td><td>Download 模式，試了 2 次（無效）</td><td>1004:633A</td></tr><tr><td>關機，按住音量上＋音量下再插 USB</td><td>關機充電畫面（無效）</td><td>1004:6300</td></tr><tr><td>同上，時機稍早</td><td>LG 的 IMEI 條碼資訊畫面，無害，按電源離開（無效）</td><td>1004:633E → 斷線</td></tr></tbody></table>
<p>成功的按法（14:00:23 偵測到 05C6:9008）：</p>
<ol>
<li class="">手機接著 Mac，從 Download 模式或開機狀態開始都可以</li>
<li class=""><strong>按住電源＋音量下，全程不要放</strong></li>
<li class="">螢幕一黑，另一隻手指快速連按音量上</li>
<li class="">電腦偵測到 9008 之後，才放開所有按鍵</li>
</ol>
<p>一開始我照英文教學，理解成「黑屏時放開電源＋音量下」，所以一直進到 Download 模式。後來看 <a href="https://www.link-nemo.com/u/10001/post/257028" target="_blank" rel="noopener noreferrer" class="">Nemo 社區的中文原文</a>，上面寫得很清楚：「切記同時不要鬆開音量減和電源鍵」。</p>
<p>成功那次的 USB 變化：</p>
<div class="language-text codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-text codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">13:59:55  1004:633A  Download 模式</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">14:00:04  斷線 → 1004:633E</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">14:00:21  斷線（黑屏）</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">14:00:23  05C6:9008  EDL ✔</span><br></div></code></pre></div></div>
<p>兩隻手按著按鍵很難同時盯螢幕，所以寫了一個小迴圈，偵測到 9008 就用 Mac 的語音念出來：</p>
<div class="language-sh codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-sh codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 偵測到 Qualcomm 9008 時用語音通知，就不用盯著螢幕</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">while :; do</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  ioreg -p IOUSB -l -w0 | grep -q '"idProduct" = 36872' &amp;&amp; { say "E D L"; break; }</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  sleep 0.3</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">done</span><br></div></code></pre></div></div>
<p>36872 就是 0x9008（1478 是 0x05C6）。Mac 靜音的時候聽不到 <code>say</code>，後來另外用 <code>osascript</code> 跳出視窗：</p>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">osascript -e 'display alert "偵測到 EDL！" message "立刻放開所有按鍵，不要再碰手機。" giving up after 15'</span><br></div></code></pre></div></div>
<p>另外兩個坑：</p>
<ul>
<li class="">電源＋音量下按滿約 10 秒會強制重開，在 EDL 裡也一樣，所以偵測到 9008 就要立刻全部放開</li>
<li class="">手機在 EDL 裡進入錯誤狀態後，只能重新進一次 EDL（按電源＋音量下重開）</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="讀分區表只讀">讀分區表（只讀）<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E8%AE%80%E5%88%86%E5%8D%80%E8%A1%A8%E5%8F%AA%E8%AE%80" class="hash-link" aria-label="讀分區表（只讀）的直接連結" title="讀分區表（只讀）的直接連結" translate="no">​</a></h2>
<div class="language-sh codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-sh codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">python edl.py printgpt --memory=ufs --loader=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin</span><br></div></code></pre></div></div>
<ul>
<li class="">CPU 是 SDM845，PK_HASH 開頭 <code>1030cd12ce708f29</code>，跟 loader 檔名一致</li>
<li class="">firehose 支援 14 個指令：program、read、nop、patch、configure、setbootablestoragedrive、erase、power、firmwarewrite、getstorageinfo、benchmark、emmc、ufs、fixgpt</li>
<li class="">UFS 是東芝 THGAF8G9T43BAIRB0300，7 個 LUN，block 4096</li>
<li class="">OP_a 大小 0x1c200000（450 MB），比 30e 的 OP.bin（650 MB）小，證實 OP 不能刷</li>
</ul>
<p>各 LUN 的完整分區清單（照分區表順序）：</p>
<ul>
<li class="">LUN0：mpt、drm、sns、ssd、persist、misc、ftm、power、encrypt、eksst、rct、fota、srtc、pstore、els、carrier、persdata、oem_a、oem_b、vendor_a、vendor_b、system_a、system_b、OP_a、OP_b、userdata、grow</li>
<li class="">LUN1：xbl_a、xbl_config_a</li>
<li class="">LUN2：xbl_b、xbl_config_b</li>
<li class="">LUN3：ALIGN_TO_128K_1、cdt、ddr</li>
<li class="">LUN4：aop_a、tz_a、hyp_a、modem_a、mdtpsecapp_a、mdtp_a、abl_a、dsp_a、keymaster_a、akmu_a、boot_a、cmnlib_a、cmnlib64_a、devcfg_a、qupfw_a、laf_a、vbmeta_a、dtbo_a、storsec_a、raw_resources_a、sid_a、aop_b、tz_b、hyp_b、modem_b、mdtpsecapp_b、mdtp_b、abl_b、dsp_b、keymaster_b、akmu_b、boot_b、cmnlib_b、cmnlib64_b、devcfg_b、qupfw_b、laf_b、vbmeta_b、dtbo_b、storsec_b、raw_resources_b、sid_b、sec、devinfo、dip、apdp、msadp、spunvm、limits、toolsfv、logfs、sti、logdump</li>
<li class="">LUN5：ALIGN_TO_128K_2、modemst1、modemst2、fsg、fsc（IMEI 和網路設定）</li>
<li class="">LUN6：frp</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="完整備份只讀">完整備份（只讀）<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E5%AE%8C%E6%95%B4%E5%82%99%E4%BB%BD%E5%8F%AA%E8%AE%80" class="hash-link" aria-label="完整備份（只讀）的直接連結" title="完整備份（只讀）的直接連結" translate="no">​</a></h2>
<p>本來打算用 <code>rl</code> 一次讀完整機，跳過 userdata，用 <code>--genxml</code> 產生之後可以整機寫回的 rawprogram xml：</p>
<div class="language-sh codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-sh codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">python edl.py rl ~/LG-V35-backup/dumps \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  --memory=ufs --skip=userdata --genxml \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  --loader=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin</span><br></div></code></pre></div></div>
<p>結果一口氣讀失敗，前後進了 6 次 EDL 才讀完：</p>
<table><thead><tr><th>第幾次進 EDL</th><th>做法</th><th>結果</th></tr></thead><tbody><tr><td>1（14:00）</td><td><code>rl</code> 整機讀</td><td>讀了約 187 MB，到 <code>els</code> 出現 <code>USBError(32, 'Pipe error')</code>，手機進入「Sahara error state」（無效）</td></tr><tr><td>2（14:11）</td><td>偵測到後隔約 1 分鐘才開始讀</td><td>手機已經自己重開回 Android，可能等太久，或電源鍵按太久（無效）</td></tr><tr><td>3（14:15）</td><td>每個分區各呼叫一次 <code>edl r</code></td><td>modemst1/2、fsg、fsc、devinfo、sec、abl_a/b 成功；讀 laf_a 時手機重開，推測是聽到提示後電源鍵還按著超過 10 秒</td></tr><tr><td>4（14:21）</td><td>同上</td><td>laf_a/b、boot_a 成功；boot_b 讀到一半 Pipe error</td></tr><tr><td>5（14:25）</td><td>同上</td><td>cdt、ddr、frp、carrier、persdata 成功；<code>els</code> 又失敗（Input/Output Error）</td></tr><tr><td>6（14:37）</td><td><strong>同一個 LUN 的分區用一次 <code>edl r</code> 讀完</strong>（逗號分隔清單）</td><td>32 個分區一次成功；接著讀 b 槽的韌體也成功，讀到 modem_a 時又 Pipe error（有效）</td></tr></tbody></table>
<p>每讀一個分區就重新呼叫一次 edl，等於每次都重新連線，在這台手機上很容易觸發 USB Overflow／Pipe error。bkerler/edl 的 <a href="https://github.com/bkerler/edl/issues/752" target="_blank" rel="noopener noreferrer" class="">issue #752</a> 也有人回報「第二次連線就 overflow」。改成一個 LUN 呼叫一次之後穩定很多。</p>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="整理後的備份指令">整理後的備份指令<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E6%95%B4%E7%90%86%E5%BE%8C%E7%9A%84%E5%82%99%E4%BB%BD%E6%8C%87%E4%BB%A4" class="hash-link" aria-label="整理後的備份指令的直接連結" title="整理後的備份指令的直接連結" translate="no">​</a></h3>
<p>下面是把上面的做法整理成可以直接跑的版本。語法和參數已經用假的 edl 乾跑測試過，但這份指令本身還沒接真機跑過（🧪），下次進 EDL 時會實際跑一次確認。</p>
<p>在 edl 的資料夾裡執行，手機要已經在 EDL（9008）。<code>edl r</code> 可以用逗號一次指定多個分區和對應的檔名，所以先寫一個小函式把清單接起來：</p>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">cd edl                                   # bkerler/edl 的資料夾</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">PY=../venv/bin/python                    # 安裝 edl 相依套件的 venv</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">LOADER=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">OUT=~/LG-V35-backup/dumps                # 備份存放位置</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 讀取同一個 LUN 的多個分區（只呼叫 edl 一次），已經存在的檔案會跳過</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun() {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  local lun=$1; shift</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  local names=() files=() p</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  mkdir -p "$OUT/lun$lun"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  for p in "$@"; do</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    [ -s "$OUT/lun$lun/$p.bin" ] &amp;&amp; continue</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    names+=("$p"); files+=("$OUT/lun$lun/$p.bin")</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  done</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  [ ${#names[@]} -eq 0 ] &amp;&amp; return 0</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  (IFS=,; "$PY" edl.py r "${names[*]}" "${files[*]}" --memory=ufs --lun="$lun" --loader="$LOADER")</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">}</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 1. 手機獨有：IMEI／網路設定</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 5 modemst1 modemst2 fsg fsc</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 2. 手機獨有：校準、出廠、解鎖狀態（els 讀不到，不列）</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 0 mpt drm sns ssd persist misc ftm power encrypt eksst rct fota srtc pstore carrier persdata</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 3 cdt ddr</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 6 frp</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 4 devinfo sec apdp msadp spunvm limits toolsfv dip logfs sti</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 3. 開機鏈（a/b 兩槽）</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 1 xbl_a xbl_config_a</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 2 xbl_b xbl_config_b</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 4 abl_a abl_b laf_a laf_b boot_a boot_b vbmeta_a vbmeta_b dtbo_a dtbo_b</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 4. 韌體（a/b 兩槽）</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 4 tz_a aop_a hyp_a keymaster_a cmnlib_a cmnlib64_a devcfg_a qupfw_a storsec_a \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">           sid_a akmu_a raw_resources_a mdtpsecapp_a mdtp_a dsp_a</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">read_lun 4 tz_b aop_b hyp_b keymaster_b cmnlib_b cmnlib64_b devcfg_b qupfw_b storsec_b \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">           sid_b akmu_b raw_resources_b mdtpsecapp_b mdtp_b dsp_b</span><br></div></code></pre></div></div>
<p>幾個要注意的地方：</p>
<ul>
<li class="">一次 EDL 裡呼叫 edl 的次數還是越少越好，我實測到第 5 次呼叫時又出現 Pipe error。中斷後重新進 EDL，再跑同樣的指令就好，已經讀好的會自動跳過</li>
<li class="">讀到一半中斷的檔案大小會不對，重跑前要先刪掉（或像下一節那樣比對大小）</li>
<li class=""><code>els</code>（LUN0，16 MB）兩次都讀到 3～4 MB 就失敗，判定讀不到，跳過。讀到一半的檔案另外留著，不列入雜湊清單</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="驗證備份">驗證備份<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E9%A9%97%E8%AD%89%E5%82%99%E4%BB%BD" class="hash-link" aria-label="驗證備份的直接連結" title="驗證備份的直接連結" translate="no">​</a></h3>
<p>拿 <code>printgpt</code> 的輸出當基準，檢查每個分區有沒有備份到、大小對不對、內容是不是全空：</p>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 先把分區表存成檔案（手機在 EDL 時執行一次即可）</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">cd edl</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">../venv/bin/python edl.py printgpt --memory=ufs \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  --loader=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin &gt; ~/LG-V35-backup/printgpt.log</span><br></div></code></pre></div></div>
<div class="language-python codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-python codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">#!/usr/bin/env python3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># verify_backup.py &lt;printgpt.log&gt; &lt;dumps 資料夾&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sys</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">log</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dumps </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> sys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> parts </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> line </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">open</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">log</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    m </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token keyword" style="color:rgb(86, 156, 214)">match</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">r'Parsing Lun (\d+)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> line</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        lun </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    m </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token keyword" style="color:rgb(86, 156, 214)">match</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">r'(\S+):\s+Offset 0x[0-9a-f]+, Length 0x([0-9a-f]+)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> line</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> m </span><span class="token keyword" style="color:rgb(86, 156, 214)">and</span><span class="token plain"> lun </span><span class="token keyword" style="color:rgb(86, 156, 214)">is</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        parts</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">16</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">missing</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> wrong_size</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> empty </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> length </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> parts</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> name </span><span class="token operator" style="color:rgb(212, 212, 212)">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'userdata'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    path </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">dumps</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">.bin'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">exists</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        missing</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    size </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">getsize</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> size </span><span class="token operator" style="color:rgb(212, 212, 212)">!=</span><span class="token plain"> length</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        wrong_size</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> (</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">size</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> != </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">length</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    data </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">open</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'rb'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">read</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">any</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">i</span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token number" style="color:rgb(181, 206, 168)">4096</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">b'\x00'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">and</span><span class="token plain"> data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">i</span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token number" style="color:rgb(181, 206, 168)">4096</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">b'\xff'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">               </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> i </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">range</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">len</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">4096</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        empty</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'missing:'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> missing</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'wrong size:'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> wrong_size</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'all zero/FF:'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> empty</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">python3 verify_backup.py ~/LG-V35-backup/printgpt.log ~/LG-V35-backup/dumps</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 最後產生雜湊清單，之後可用 shasum -c 檢查備份有沒有損壞</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">cd ~/LG-V35-backup/dumps &amp;&amp; find . -name '*.bin' -print0 | sort -z | xargs -0 shasum -a 256 &gt; ../SHA256SUMS.txt</span><br></div></code></pre></div></div>
<ul>
<li class="">「wrong size」通常是讀到一半中斷，刪掉那個檔再重讀</li>
<li class="">「all zero/FF」不一定是錯，有些分區本來就是空的，但要回頭看讀取紀錄有沒有錯誤</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Emow" id="備份結果">備份結果<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E5%82%99%E4%BB%BD%E7%B5%90%E6%9E%9C" class="hash-link" aria-label="備份結果的直接連結" title="備份結果的直接連結" translate="no">​</a></h3>
<p>77 個分區，加上 2 個分區表檔（gpt_main0、gpt_backup0），約 1 GB。SHA-256 清單涵蓋這 79 個檔案（讀到一半的 els 不列入），連同完整分區表和 rawprogram xml 一起存在 Mac 上：</p>
<table><thead><tr><th>類別</th><th>分區</th><th>狀態</th></tr></thead><tbody><tr><td>IMEI／網路設定（4）</td><td>modemst1、modemst2、fsg、fsc</td><td>✅（fsc 本來就是空的）</td></tr><tr><td>校準／出廠（15）</td><td>persist、ftm、mpt、cdt、ddr、carrier、persdata、power、drm、sns、ssd、rct、srtc、fota、pstore</td><td>✅</td></tr><tr><td>解鎖狀態（2）</td><td>devinfo、sec</td><td>✅</td></tr><tr><td>開機鏈（a/b 兩槽，14）</td><td>xbl、xbl_config、abl、laf、boot、vbmeta、dtbo</td><td>✅</td></tr><tr><td>韌體（a/b 兩槽，30）</td><td>tz、aop、hyp、keymaster、cmnlib、cmnlib64、devcfg、qupfw、storsec、sid、akmu、raw_resources、mdtp、mdtpsecapp、dsp</td><td>✅</td></tr><tr><td>其他小分區（12）</td><td>frp、apdp、msadp、spunvm、limits、toolsfv、dip、logfs、sti、misc、encrypt、eksst</td><td>✅</td></tr></tbody></table>
<p>全空（全 0 或全 FF）的有 12 個：misc、eksst、cdt、fsc、mdtpsecapp_a、mdtpsecapp_b、mdtp_a、mdtp_b、dip、spunvm、toolsfv、sti。大小正確、讀取也沒有錯誤，判定本來就是空的。</p>
<p>沒備份的有：</p>
<ul>
<li class="">system、vendor、OP、oem、modem 的 a/b 兩槽，共約 12 GB，NAS 上的 Pie 20f KDZ 裡都有</li>
<li class="">logdump（系統紀錄）、grow、ALIGN_TO_128K_*（對齊用的空分區）</li>
<li class="">讀不到的 els</li>
</ul>
<p>手機獨有、下載不到的分區都已經備份到了。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="把-30e-寫進-b-槽">把 30e 寫進 b 槽<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E6%8A%8A-30e-%E5%AF%AB%E9%80%B2-b-%E6%A7%BD" class="hash-link" aria-label="把 30e 寫進 b 槽的直接連結" title="把 30e 寫進 b 槽的直接連結" translate="no">​</a></h2>
<p>準備：</p>
<ul>
<li class="">從 30e 包只解出 <code>partitions/</code>，排除 <code>OP.bin</code>（比分區大）和 <code>persist.bin</code>（原作者手機的校準資料）</li>
<li class="">不用 <code>modified/</code>，只用原廠映像</li>
<li class="">26 個映像依 GPT 對到 <code>_b</code> 分區，大小全部跟分區長度相同</li>
<li class="">依 LUN 分資料夾：LUN4（21 個）、LUN2（xbl_b、xbl_config_b）、LUN0（oem_b、system_b、vendor_b）</li>
</ul>
<p>準備檔案，把 30e 的映像改名成 <code>_b</code> 分區名，依 LUN 分資料夾：</p>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">ZIP=~/Downloads/V350AWM30e.zip</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">STAGE=~/LG-V35-work/30e_slot_b</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">mkdir -p "$STAGE" &amp;&amp; cd "$STAGE"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 只解出原廠分區，排除 OP 與 persist</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">unzip -q "$ZIP" 'V350AWM30e/partitions/*' \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  -x 'V350AWM30e/partitions/OP.bin' 'V350AWM30e/partitions/persist.bin'</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">P=V350AWM30e/partitions</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">mkdir -p lun0 lun2 lun4</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">for n in oem system vendor;      do mv "$P/$n.bin" "lun0/${n}_b.bin"; done</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">for n in xbl xbl_config;         do mv "$P/$n.bin" "lun2/${n}_b.bin"; done</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">for n in abl akmu aop boot cmnlib cmnlib64 devcfg dsp dtbo hyp keymaster laf \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">         mdtp mdtpsecapp modem qupfw raw_resources sid storsec tz vbmeta; do</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  mv "$P/$n.bin" "lun4/${n}_b.bin"</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">done</span><br></div></code></pre></div></div>
<p>寫入前一定要先做自我檢查：拿<strong>你自己手機</strong>的分區表比對每個映像，任何一個不符就不要寫，代表你的手機跟本文的環境不同。</p>
<div class="language-python codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-python codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)">#!/usr/bin/env python3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># precheck_30e.py &lt;printgpt.log&gt; &lt;staging folder&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Before writing: every staged image must map to an existing partition on THIS phone,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># sit on the expected LUN, and be EXACTLY the partition's size. Any mismatch -&gt; do not write.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sys</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">log</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> stage </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> sys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">NEVER </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string" style="color:rgb(206, 145, 120)">'persist'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'ftm'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'mpt'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'misc'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'persdata'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'modemst1'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'modemst2'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'fsg'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'fsc'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">         </span><span class="token string" style="color:rgb(206, 145, 120)">'devinfo'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'frp'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'OP_a'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">'OP_b'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> gpt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> line </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">open</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">log</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    m </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token keyword" style="color:rgb(86, 156, 214)">match</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">r'Parsing Lun (\d+)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> line</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        lun </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    m </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token keyword" style="color:rgb(86, 156, 214)">match</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">r'(\S+):\s+Offset 0x[0-9a-f]+, Length 0x([0-9a-f]+)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> line</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> m </span><span class="token keyword" style="color:rgb(86, 156, 214)">and</span><span class="token plain"> lun </span><span class="token keyword" style="color:rgb(86, 156, 214)">is</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        gpt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">16</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> count </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> d </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">sorted</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">listdir</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">stage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    m </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">fullmatch</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">r'lun(\d+)'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    folder_lun </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> f </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">sorted</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">listdir</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">stage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> f</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">endswith</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'.bin'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            </span><span class="token keyword" style="color:rgb(86, 156, 214)">continue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        count </span><span class="token operator" style="color:rgb(212, 212, 212)">+=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        name </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> f</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        size </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">getsize</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">stage</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> name </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> NEVER</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">d</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> must never be written'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">elif</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">endswith</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'_b'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">d</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">: not a slot-b partition'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">elif</span><span class="token plain"> name </span><span class="token keyword" style="color:rgb(86, 156, 214)">not</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">d</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">: partition </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> does not exist on this phone'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">elif</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">!=</span><span class="token plain"> folder_lun</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">d</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> is on lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">gpt</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string-interpolation interpolation number" style="color:rgb(181, 206, 168)">0</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">, not lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">folder_lun</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">elif</span><span class="token plain"> size </span><span class="token operator" style="color:rgb(212, 212, 212)">!=</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">            problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">d</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">: image </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">size</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> bytes != partition </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">gpt</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token string-interpolation interpolation number" style="color:rgb(181, 206, 168)">1</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> bytes'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f'checked </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">count</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)"> images'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'DO NOT WRITE:'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> p </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> problems</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'  '</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    sys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">exit</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">'OK: every image matches a slot-b partition of exactly the same size'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">python3 precheck_30e.py ~/LG-V35-backup/printgpt.log ~/LG-V35-work/30e_slot_b</span><br></div></code></pre></div></div>
<p>我的手機跑出來的結果：</p>
<div class="language-text codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-text codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">checked 26 images</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">OK: every image matches a slot-b partition of exactly the same size</span><br></div></code></pre></div></div>
<p>也故意用錯的輸入測過：放了 persist、放錯 LUN、大小不符，都會列出問題並回傳錯誤碼 1。</p>
<p>寫入一樣是一個 LUN 呼叫一次 edl，全部在同一次 EDL 裡做完。這段也是整理後的版本（🧪）：</p>
<div class="language-bash codeBlockContainer_Ot__ theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_z6Hy"><pre tabindex="0" class="prism-code language-bash codeBlock_Y5th thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_bbfM"><div class="token-line" style="color:#9CDCFE"><span class="token plain">cd edl</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">PY=../venv/bin/python</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">LOADER=Loaders/LG/0008b0e100310000_1030cd12ce708f29_fhprg.bin</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">STAGE=~/LG-V35-work/30e_slot_b</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain"># 把某個 LUN 資料夾裡的所有 &lt;分區名&gt;.bin 一次寫入</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">write_lun() {</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  local lun=$1 names=() files=() f</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  for f in "$STAGE/lun$lun"/*.bin; do</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">    names+=("$(basename "$f" .bin)"); files+=("$f")</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  done</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  (IFS=,; "$PY" edl.py w "${names[*]}" "${files[*]}" --memory=ufs --lun="$lun" --loader="$LOADER")</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">}</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">python3 ../precheck_30e.py ~/LG-V35-backup/printgpt.log "$STAGE" &amp;&amp; \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  write_lun 4 &amp;&amp; write_lun 2 &amp;&amp; write_lun 0 &amp;&amp; \</span><br></div><div class="token-line" style="color:#9CDCFE"><span class="token plain">  "$PY" edl.py setactiveslot b --loader="$LOADER"</span><br></div></code></pre></div></div>
<ul>
<li class="">自我檢查沒通過，就完全不會寫入</li>
<li class="">用 <code>&amp;&amp;</code> 串起來，任何一步失敗就停下，不會在寫入不完整時切換槽位</li>
<li class="">寫入前 edl 會檢查映像是不是比分區大，太大就不寫</li>
</ul>
<table><thead><tr><th>步驟</th><th>花的時間</th><th>結果</th></tr></thead><tbody><tr><td>LUN4 的 21 個分區</td><td>22 秒</td><td>✅</td></tr><tr><td>LUN2</td><td>1 秒</td><td>✅</td></tr><tr><td>LUN0（含 4.4 GB 的 system_b）</td><td>3 分 7 秒，約 30 MB/s</td><td>✅</td></tr><tr><td>setactiveslot b</td><td>13 秒</td><td>✅</td></tr></tbody></table>
<p>寫完核對 log：每個寫入的起始磁區都等於 GPT 上 <code>_b</code> 分區的起點（例如 abl_b 155126、system_b 1754886、xbl_b 6），a 槽沒有被寫到。這次進 EDL 也是試了很多次才成功。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="第一次開機進-android-10">第一次開機進 Android 10<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E7%AC%AC%E4%B8%80%E6%AC%A1%E9%96%8B%E6%A9%9F%E9%80%B2-android-10" class="hash-link" aria-label="第一次開機進 Android 10的直接連結" title="第一次開機進 Android 10的直接連結" translate="no">​</a></h2>
<p>長按電源＋音量下重開，這次不按音量上。LG 標誌停了約 3 分鐘（Pie 留下的資料在做第一次開機的升級），15:03:49 adb 上線。沒有清資料，Pie 的 userdata 直接升級成功。</p>
<table><thead><tr><th>檢查</th><th>結果</th></tr></thead><tbody><tr><td>Android 版本／槽位</td><td>10／_b</td></tr><tr><td>軟體版本</td><td>V350AWM30e</td></tr><tr><td>出廠字串</td><td>LMV350AT-00-V30e-LAO-COM-JUL-28-2020-<strong>ARB00</strong>+0</td></tr><tr><td>防降級（ARB）</td><td>00，跟 Pie 20f 相同，之後可以退回 Pie</td></tr><tr><td>安全性更新</td><td>2020-04-01</td></tr><tr><td>Bootloader</td><td>仍是解鎖狀態（orange、flash.locked=0）</td></tr><tr><td>基頻</td><td>MPSS.AT.4.0.c2.9-00088-SDM845_GEN_PACK</td></tr><tr><td>Wi-Fi</td><td>已連線、VALIDATED，ping 正常</td></tr><tr><td>IMEI</td><td>讀得到 15 位數</td></tr><tr><td>Hi-Fi Quad DAC</td><td>persist.lge.hifiquaddac=true、hifi_dac=ON</td></tr></tbody></table>
<p>30e 的 ARB 值在網路上查不到，這次直接從手機讀到是 <strong>ARB00</strong>。</p>
<div class="row_hQZc"><p><span class="figure_csq_"><img decoding="async" loading="lazy" alt="升到 Android 10（30e）後的主畫面，16:26 拍" src="https://ttylab80387.com/assets/images/android10-home-e3e145e866593bb7a17f07e1513ac402.jpg" width="1080" height="1440" class="img_QA5C"><span class="caption_yuVx" aria-hidden="true">升到 Android 10（30e）後的主畫面，16:26 拍</span></span></p><p><span class="figure_csq_"><img decoding="async" loading="lazy" alt="關於手機：Android 版本 10、軟體版本 V30e-310-410、型號 LM-V350AWM（S/N 和 IMEI 已塗掉）" src="https://ttylab80387.com/assets/images/android10-about-f2417ad88b0c7749637bd98383cd5bd1.jpg" width="1080" height="1440" class="img_QA5C"><span class="caption_yuVx" aria-hidden="true">關於手機：Android 版本 10、軟體版本 V30e-310-410、型號 LM-V350AWM（S/N 和 IMEI 已塗掉）</span></span></p></div>
<p>刷成 Android 10 之後，滑動 UI 感覺比 Android 9 還順暢。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="下集要做的事">下集要做的事<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E4%B8%8B%E9%9B%86%E8%A6%81%E5%81%9A%E7%9A%84%E4%BA%8B" class="hash-link" aria-label="下集要做的事的直接連結" title="下集要做的事的直接連結" translate="no">​</a></h2>
<ul>
<li class="">移除手機上的 Google 帳號，避免觸發出廠重設保護</li>
<li class="">用 EDL 把 Lineage Recovery（官方的 boot.img）寫進 boot_a、boot_b，不需要 root</li>
<li class="">在 Lineage Recovery 裡 sideload copy-partitions，把 b 槽複製到 a 槽（會蓋掉 a 槽的 Pie）</li>
<li class="">Format data，sideload LineageOS 22.2，再 sideload MindTheGapps</li>
<li class="">檢查 DAC 面板、Wi-Fi，以及要測的 App 裝不裝得上</li>
<li class="">下次進 EDL 時，用整理後的 <code>read_lun</code> 實際跑一次（例如重讀一個小分區比對 SHA-256），把 🧪 改成 ✅</li>
</ul>
<p>這次最花時間的兩件事都不是寫入本身：一個是進 EDL 時按鍵全程不能放，另一個是 edl 每呼叫一次就重連，分區要照 LUN 一次讀完才穩。</p>
<h2 class="anchor anchorTargetStickyNavbar_Emow" id="參考資料">參考資料<a href="https://ttylab80387.com/research/lg-v35-lineageos-1/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99" class="hash-link" aria-label="參考資料的直接連結" title="參考資料的直接連結" translate="no">​</a></h2>
<p>官方：</p>
<ul>
<li class=""><a href="https://wiki.lineageos.org/devices/judyp/" target="_blank" rel="noopener noreferrer" class="">LineageOS Wiki：LG V35 ThinQ（judyp）</a></li>
<li class=""><a href="https://wiki.lineageos.org/devices/judyp/install/" target="_blank" rel="noopener noreferrer" class="">LineageOS 安裝說明</a>（Android 10 韌體要求、root、copy-partitions）</li>
<li class=""><a href="https://download.lineageos.org/devices/judyp" target="_blank" rel="noopener noreferrer" class="">LineageOS 下載（judyp）</a></li>
<li class=""><a href="https://wiki.lineageos.org/gapps/" target="_blank" rel="noopener noreferrer" class="">LineageOS GApps 說明</a></li>
<li class=""><a href="https://github.com/MindTheGapps/15.0.0-arm64/releases" target="_blank" rel="noopener noreferrer" class="">MindTheGapps 15.0.0 arm64</a></li>
<li class="">LineageOS 裝置原始碼（Quad DAC 支援）：<a href="https://github.com/LineageOS/android_device_lge_judyp" target="_blank" rel="noopener noreferrer" class="">android_device_lge_judyp</a>、<a href="https://github.com/LineageOS/android_device_lge_sdm845-common" target="_blank" rel="noopener noreferrer" class="">android_device_lge_sdm845-common</a>、<a href="https://github.com/LineageOS/android_hardware_lge" target="_blank" rel="noopener noreferrer" class="">android_hardware_lge</a>（dac_panel）</li>
</ul>
<p>工具：</p>
<ul>
<li class=""><a href="https://github.com/bkerler/edl" target="_blank" rel="noopener noreferrer" class="">bkerler/edl</a>（開源 Qualcomm EDL 工具，GPL-3.0）</li>
<li class=""><a href="https://github.com/bkerler/Loaders/tree/main/LG" target="_blank" rel="noopener noreferrer" class="">bkerler/Loaders</a>（LG SDM845 firehose）</li>
<li class=""><a href="https://github.com/bkerler/edl/issues/752" target="_blank" rel="noopener noreferrer" class="">edl issue #752</a>（重新連線觸發 USB Overflow）</li>
<li class=""><a href="https://github.com/bkerler/edl/issues/103" target="_blank" rel="noopener noreferrer" class="">edl issue #103</a>（LG G6 的 USB Overflow）</li>
</ul>
<p>教學與討論：</p>
<ul>
<li class=""><a href="https://github.com/kaneorotar/LG-V35-Tinkering-Instructions/blob/master/README_EN.MD" target="_blank" rel="noopener noreferrer" class="">kaneorotar：LG V35 Tinkering Instructions</a>（EDL、解鎖、TWRP）</li>
<li class=""><a href="https://xdaforums.com/t/v350ulm-us-open-oreo-10i-ulm-pie-20f-awm30e-final-q-downloads.4791168/" target="_blank" rel="noopener noreferrer" class="">XDA：V350ULM Oreo 10i／ULM Pie 20f／AWM30e final Q 下載整理</a></li>
<li class=""><a href="https://xdaforums.com/t/v350awm30e-att_us-stock-rooted-partitions.4322737/" target="_blank" rel="noopener noreferrer" class="">XDA：V350AWM30e ATT_US stock &amp; rooted partitions</a>（30e 分區包的原始出處）</li>
<li class=""><a href="https://xdaforums.com/t/v350awm30e-android-10-stuck-in-fastboot-no-recovery.4790905/" target="_blank" rel="noopener noreferrer" class="">XDA：V350AWM30e android 10 stuck in fastboot</a>（從 30e 退回 Pie 20f 的案例）</li>
<li class=""><a href="https://xdaforums.com/t/nightly-judyp-official-lineageos-for-the-lg-v35-thinq.4684490/" target="_blank" rel="noopener noreferrer" class="">XDA：Official LineageOS for the LG V35 ThinQ</a></li>
<li class=""><a href="https://www.link-nemo.com/u/10001/post/257028" target="_blank" rel="noopener noreferrer" class="">Nemo 社區：LG V35 解鎖 BL 教程</a>（EDL 按法：電源＋音量下不放、黑屏連按音量上）</li>
<li class=""><a href="https://www.link-nemo.com/u/10001/post/269932" target="_blank" rel="noopener noreferrer" class="">Nemo 社區：LG V35 9008 救磚教程</a></li>
<li class=""><a href="https://www.link-nemo.com/u/10001/post/260876" target="_blank" rel="noopener noreferrer" class="">Nemo 社區：飞羽 ROM 30a</a>（研究過但沒採用）</li>
</ul>
<p>韌體資料庫：</p>
<ul>
<li class=""><a href="https://lgrom.com/firmware/LMV350AWM" target="_blank" rel="noopener noreferrer" class="">LGROM：LM-V350AWM</a></li>
<li class=""><a href="https://www.lg-firmwares.com/lg-lmv350ulm-firmwares/" target="_blank" rel="noopener noreferrer" class="">LG-Firmwares：LM-V350ULM</a></li>
</ul>]]></content:encoded>
            <category>Android 刷機</category>
            <category>LG 手機</category>
            <category>LineageOS</category>
            <category>EDL（高通 9008）</category>
            <category>備份</category>
            <category>macOS</category>
        </item>
    </channel>
</rss>