<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://www.nkbe.top/</id>
  <title type="text">NkBe</title>
  <subtitle type="text">nkbe.top</subtitle>
  <updated>2026-11-08T00:00:00.000Z</updated>
  <author><name>NkBe</name></author>
  <link rel="alternate" href="https://www.nkbe.top/"/>
  <link rel="self" href="https://www.nkbe.top/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://www.nkbe.top/posts/hello/</id>
      <title type="text">你好，這裡是 NkBe 的新站</title>
      <published>2026-10-06T00:00:00.000Z</published>
      <updated>2026-10-06T00:00:00.000Z</updated>
      <author><name>NkBe</name></author>
      <link rel="alternate" href="https://www.nkbe.top/posts/hello/"/>
      <summary type="text">個人站改用 Astro 重建，這是第一篇文章。</summary>
      <content type="html"><![CDATA[<p>這個站原本只是一頁導航，現在換成 Astro + Firefly 主題，之後會把專案紀錄和技術筆記寫在這裡。</p>
<p>目前還在整理中，專案請先看 <a href="/projects/">專案頁</a>。</p>]]></content>
    </entry>
    <entry>
      <id>https://www.nkbe.top/posts/oneplus-ace6t-bl-unlock-root/</id>
      <title type="text">一加 Ace 6T 免深度測試秒解 Bootloader、偽回鎖與永久 Root 實錄</title>
      <published>2026-11-08T00:00:00.000Z</published>
      <updated>2026-11-08T00:00:00.000Z</updated>
      <author><name>NkBe</name></author>
      <link rel="alternate" href="https://www.nkbe.top/posts/oneplus-ace6t-bl-unlock-root/"/>
      <summary type="text">記錄一加 Ace 6T（SM8845 / ColorOS 16）透過內核漏洞臨時提權、刷入工程 ABL 與 GBL efisp 注入 superfastboot 秒解 BL、偽回鎖綠標特性，以及專用魔改版 TWRP 的使用與避坑實測。</summary>
      <content type="html"><![CDATA[<p>近期一加收緊了新機型的官方 Bootloader 解鎖申請。這篇記錄在一加 Ace 6T（代號 <code>macan</code>，型號 <code>PLR110</code>，搭載高通 SM8845 / 驍龍 8 Gen 5，系統版本 <code>PLR110_16.0.10.500(CN01)</code>）上，利用內核漏洞臨時提權、替換引導分區注入 <code>superfastboot</code> 秒解 BL、達成綠標「偽回鎖」並部署 SukiSU 永久 Root 的完整實測流程。</p>
<p>文末同時附上我們二次魔改的 Android 16 專用 TWRP Recovery，以及針對「非官方深度測試真解鎖」環境下的使用規範與踩坑記錄。</p>
<hr />
<section><h2>💡 方案特性總結<a href="#-方案特性總結"><span>#</span></a></h2><ul>
<li><strong>免深度測試秒解 BL</strong>：不走官方排隊審核，利用漏洞臨時提權寫入紫標 ABL 與 GBL <code>efisp</code>，透過 <code>superfastboot</code> 直接達成 <code>unlocked: yes</code>。</li>
<li><strong>偽回鎖綠標狀態</strong>：系統底層回報 <code>ro.boot.vbmeta.device_state=locked</code> 與 <code>ro.boot.verifiedbootstate=green</code>，開機無 Orange State 解鎖黃字警告，能無痛通過依賴 BL 狀態的各類環境檢測。</li>
<li><strong>一氣呵成永久 Root</strong>：在解鎖清數據的同一趟引導流程中刷入修補好的 <code>init_boot</code>，開機即完成 SukiSU 永久 Root。</li>
</ul><hr /></section>
<section><h2>🧩 整體原理：四個關鍵環節<a href="#-整體原理四個關鍵環節"><span>#</span></a></h2><p>整個方案由四個環節組成：</p>

<table><thead><tr><th>環節</th><th>目標</th><th>核心操作</th></tr></thead><tbody><tr><td><strong>1. 臨時提權（越獄）</strong></td><td>在未解鎖系統上取得 <code>root</code> 權限</td><td>利用 <code>CVE-2026-43499-S26</code> 漏洞載入臨時 KernelSU，授權給 <code>adb shell</code></td></tr><tr><td><strong>2. 預提取與修補</strong></td><td>準備永久 Root 與原機防磚備份</td><td>提取原廠 <code>abl_a/b</code>、<code>efisp</code>、<code>recovery_a</code> 備份，並預先將 <code>init_boot</code> 交由 SukiSU 修補</td></tr><tr><td><strong>3. 注入 <code>superfastboot</code></strong></td><td>替換引導程序與偽回鎖模組</td><td>寫入具備高通硬體簽名的工程 <code>abl.img</code> 與基於 EDK2/GBL 的 <code>efisp.img</code></td></tr><tr><td><strong>4. 攔截秒解與固化</strong></td><td>秒解 BL、雙清與進系統</td><td>狂點「音量下」進 <code>superfastboot</code> 秒解 BL，刷入修補好的 <code>init_boot</code> 並進官方 Recovery 格式化資料</td></tr></tbody></table><hr /></section>
<section><h2>🔓 第一步：利用內核漏洞臨時提權（越獄）<a href="#-第一步利用內核漏洞臨時提權越獄"><span>#</span></a></h2><p>未解鎖狀態下無法從 Fastboot 刷入未簽名分區，因此第一步需在系統內臨時取得 Root：</p><ul>
<li><strong>ColorOS 16（<code>16.0.10.500</code>）</strong>：
安裝 <code>GhostLock_1.2.apk</code> 與 <code>KernelSU_v3.3.1.apk</code>，匯入 <code>offsets-6.12.38-...</code> 符號偏移配置，利用 <code>CVE-2026-43499-S26</code> 內核漏洞取得臨時 Root 權限。</li>
<li><strong>ColorOS 17（待測）</strong>：
提權工具可改用 <code>Shark-v2.0.apk</code>。</li>
</ul><p>提權後開啟 KernelSU，在超級用戶中將 <strong><code>Shell</code></strong> 勾選授權，確保 <code>adb shell</code> 具備 <code>su</code> 執行能力。</p><hr /></section>
<section><h2>📦 第二步：提取備份與預先修補 <code>init_boot</code><a href="#-第二步提取備份與預先修補-init_boot"><span>#</span></a></h2><p>解鎖 BL 會強制清空 <code>userdata</code>，因此必須先將永久 Root 鏡像修補好並拉回電腦：</p><section><h3>1. 備份原機關鍵分區<a href="#1-備份原機關鍵分區"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>adb</span><span> </span><span>shell</span><span> </span><span>"su -c '</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>dd if=/dev/block/by-name/abl_a of=/data/local/tmp/orig_abl_a.img &amp;&amp;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>dd if=/dev/block/by-name/abl_b of=/data/local/tmp/orig_abl_b.img &amp;&amp;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>dd if=/dev/block/by-name/efisp of=/data/local/tmp/orig_efisp.img &amp;&amp;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>dd if=/dev/block/by-name/recovery_a of=/data/local/tmp/stock_recovery_a.img &amp;&amp;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>dd if=/dev/block/by-name/init_boot_a of=/sdcard/Download/init_boot.img &amp;&amp;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>chmod 644 /data/local/tmp/*.img</span></div></div><div><div><div>8</div></div><div><span>'"</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>adb</span><span> </span><span>pull</span><span> </span><span>/data/local/tmp/orig_abl_a.img</span><span> </span><span>./</span></div></div><div><div><div>11</div></div><div><span>adb</span><span> </span><span>pull</span><span> </span><span>/data/local/tmp/orig_efisp.img</span><span> </span><span>./</span></div></div><div><div><div>12</div></div><div><span>adb</span><span> </span><span>pull</span><span> </span><span>/data/local/tmp/stock_recovery_a.img</span><span> </span><span>./</span></div></div><div><div><div>13</div></div><div><span>adb</span><span> </span><span>pull</span><span> </span><span>/sdcard/Download/init_boot.img</span><span> </span><span>./init_boot_stock.img</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2. 修補 SukiSU 鏡像<a href="#2-修補-sukisu-鏡像"><span>#</span></a></h3><p>在手機上安裝 <code>SukiSU_v4.3.0-r2.apk</code>，修補 <code>/sdcard/Download/init_boot.img</code>，完成後拉回電腦：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>adb</span><span> </span><span>pull</span><span> </span><span>/sdcard/Download/kernelsu_patched_</span><span>*</span><span>.img</span><span> </span><span>./init_boot_sukisu_patched.img</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section>
<section><h2>🛠️ 第三步：刷入工程 <code>abl.img</code> 與 GBL <code>efisp.img</code><a href="#️-第三步刷入工程-ablimg-與-gbl-efispimg"><span>#</span></a></h2><ul>
<li><strong>工程紫標 <code>abl.img</code></strong>：帶有高通 <code>OPLUS SM8845 Attestation</code> 合法硬體簽名，可安全通過 Secure Boot，並支援引導 <code>efisp</code> 中的 GBL 模組。</li>
<li><strong>GBL 引導模組 <code>efisp.img</code></strong>：基於 EDK2 / GBL 編譯，開機攔截按鍵提供 <code>superfastboot</code>（序號 <code>0000000000000000</code>），並在引導系統時注入偽回鎖參數（<code>device_state=locked</code> / <code>verifiedbootstate=green</code>）。</li>
</ul><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>adb</span><span> </span><span>push</span><span> </span><span>abl.img</span><span> </span><span>/data/local/tmp/abl.img</span></div></div><div><div><div>2</div></div><div><span>adb</span><span> </span><span>push</span><span> </span><span>efisp.img</span><span> </span><span>/data/local/tmp/efisp.img</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>adb</span><span> </span><span>shell</span><span> </span><span>"su -c '</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>dd if=/data/local/tmp/abl.img of=/dev/block/by-name/abl_a &amp;&amp;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>dd if=/data/local/tmp/abl.img of=/dev/block/by-name/abl_b &amp;&amp;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>dd if=/data/local/tmp/efisp.img of=/dev/block/by-name/efisp &amp;&amp;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>sync</span></div></div><div><div><div>9</div></div><div><span>'"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section>
<section><h2>⚠️ 第四步：關鍵避坑——按「音量下」秒解 BL<a href="#️-第四步關鍵避坑按音量下秒解-bl"><span>#</span></a></h2><p>其實開機時螢幕上就清清楚楚寫著這幾行字（根本不用刻意去逆向字串表）：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Press Volume Down key to enter Fastboot mode</span></div></div><div><div><div>2</div></div><div><span>Press Volume Up key to enter Normal mode</span></div></div><div><div><div>3</div></div><div><span>boot confirmation is blocked before unlocking</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>換句話說，引導模組的邏輯非常直白：</p><ul>
<li><strong>音量下（Volume Down）</strong>：進入 <code>superfastboot</code>。</li>
<li><strong>音量上（Volume Up）</strong>：跳過並嘗試一般開機。但在<strong>未完成解鎖前按音量上會觸發防護直接掉入 900E</strong>！很多人習慣性按音量上進 Fastboot，結果一按就黑屏掉進 900E。</li>
</ul><div><div><div></div><div>Tip</div></div><div><p>若誤入 900E，長按「電源 + 音量下」約 10～15 秒強制斷電重啟，重啟瞬間改為連續狂點「音量下」即可脫離 900E 進入 <code>superfastboot</code>。</p></div></div><section><h3>操作步驟：<a href="#操作步驟"><span>#</span></a></h3><ol>
<li>電腦端先執行指令守候：
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>fastboot</span><span> </span><span>flashing</span><span> </span><span>unlock</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>手機執行重啟，黑屏瞬間<strong>連續狂點「音量下鍵」</strong>。</li>
<li>進入 <code>superfastboot</code> 後指令瞬間返回 <code>OKAY</code>，確認 <code>unlocked: yes</code>。</li>
<li>直接刷入預先修補好的 SukiSU 鏡像並進入官方 Recovery：
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>fastboot</span><span> </span><span>flash</span><span> </span><span>init_boot_a</span><span> </span><span>init_boot_sukisu_patched.img</span></div></div><div><div><div>2</div></div><div><span>fastboot</span><span> </span><span>flash</span><span> </span><span>init_boot_b</span><span> </span><span>init_boot_sukisu_patched.img</span></div></div><div><div><div>3</div></div><div><span>fastboot</span><span> </span><span>reboot</span><span> </span><span>recovery</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>官方 Recovery 內點選「格式化數據分區（Format Data）」，輸入驗證碼清除數據並重啟。</li>
<li>進系統後安裝 <code>SukiSU_v4.3.0-r2.apk</code>，即享永久 Root 與偽回鎖狀態！</li>
</ol><hr /></section></section>
<section><h2>📦 附加內容：一加 Ace 6T 專用魔改版 TWRP Recovery<a href="#-附加內容一加-ace-6t-專用魔改版-twrp-recovery"><span>#</span></a></h2><p>為方便維護與刷入模組，我們基於社群底包（鳴謝 <a href="https://t.me/colorospro/1724" target="_blank">@colorospro/1724</a> / color597）對閉源 TWRP 進行了二次客製化：</p><ul>
<li><strong>版本自訂</strong>：界面與屬性更新為 <strong><code>3.7.1_16-Macan_NkBe918-V1.3</code></strong>。</li>
<li><strong>標識重構</strong>：將設備顯示名重定義為標準 <code>ro.product.model.display=OnePlus Ace 6T</code>。</li>
<li><strong>管理器注入</strong>：保留 <code>Magisk-v30.7.zip</code>，剔除舊版 Kitsune，全新注入 <strong><code>SukiSU-v4.3.0-r2.zip</code></strong>（內建自動適配插槽與自動執行 <code>ksud boot-patch</code> 修補 <code>init_boot</code> 的專用 <code>update-binary</code>）。</li>
</ul><section><h3>⚠️ 特別注意：未真正深度測試解鎖時的使用規範<a href="#️-特別注意未真正深度測試解鎖時的使用規範"><span>#</span></a></h3><p>實測證實，本機在當前的「偽回鎖」機制下，使用 TWRP 需遵循以下規則：</p><ol>
<li><strong>Snapdragon 8 Gen 5 不支援 <code>fastboot boot</code> 臨時引導</strong>：
Qualcomm SM8845 的工程 ABL 屬於純 64 位元 UEFI 架構，其 fastboot 記憶體引導僅接受具備 EFI Stub 標頭的映像。執行 <code>fastboot boot twrp.img</code> 會直接報錯 <code>No EFI image found in boot.img</code>，必須透過 <code>fastboot flash recovery_a</code> 寫入分區。</li>
<li><strong>非深度測試真解鎖的設備，開機前必須刷回原廠 Recovery</strong>：
透過該方案秒解 BL 的設備，其引導鏈本質上處於「偽回鎖」狀態，正常進入系統時仍受官方原廠 <code>vbmeta</code> 的嚴格驗證。
<ul>
<li><strong>可以正常使用 TWRP</strong>：需要救磚、進 TWRP 操作或刷入模組時，隨時可以 <code>fastboot flash recovery_a TWRP-16-OPAce6T-NkBe918-V1.3.img</code> 刷入並進入 TWRP，觸控與各功能均完全正常；</li>
<li><strong>但在重啟進入 ColorOS 系統前</strong>：<strong>必須將 <code>recovery</code> 刷回原廠 Recovery 鏡像</strong>（<code>stock_recovery_16.0.10.500.img</code>），否則系統在開機驗證階段發現 recovery 與 vbmeta 雜湊不匹配將無法正常引導開機。</li>
<li><em>（註：若是日後通過官方深度測試審核、真正走官方通道完全解開 BL 的設備，則可常駐保留第三方 Recovery）</em>。</li>
</ul>
</li>
</ol><hr /></section></section>
<section><h2>💾 資源整合包與網盤下載<a href="#-資源整合包與網盤下載"><span>#</span></a></h2><p>已將解鎖所需的全套工程引導、GBL 模組、臨時提權工具、SukiSU、專用魔改版 TWRP、原廠 16.0.10.500 恢復鏡像及內建推薦工具（含最新正式版 Shizuku）打包整合。提供以下載點供按需取用：</p>

<table><thead><tr><th>雲端平台</th><th>下載方式 / 說明</th><th>連結與提取碼</th></tr></thead><tbody><tr><td><strong>Google Drive</strong></td><td>ZIP 整合包，海外高速</td><td><a href="https://drive.google.com/drive/folders/1bHqB0dS8CKm5QjSqtR3ZRVGvAmZkpdfK?usp=drive_link" target="_blank">Google 雲端硬碟</a></td></tr><tr><td><strong>123 雲盤</strong></td><td>資料夾形式，免登錄不限速</td><td><a href="https://1855577741.share.123pan.cn/123pan/xWcNvd-0oII?pwd=nkbe#" target="_blank">123 雲盤</a> <br />提取碼：<code>nkbe</code></td></tr><tr><td><strong>百度網盤</strong></td><td>資料夾與 ZIP 完整收錄</td><td><a href="https://pan.baidu.com/s/1s_RkpCiMjAEyiuEWmPuMuA?pwd=nkbe" target="_blank">百度網盤</a> <br />提取碼：<code>nkbe</code></td></tr></tbody></table><section><h3>整合包目錄結構清單：<a href="#整合包目錄結構清單"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>OnePlus_Ace6T_BL_Unlock_Root_Pack/</span></div></div><div><div><div>2</div></div><div><span>├── 1_Privilege_Escalation/       # 臨時提權 (GhostLock 1.2, KernelSU, 6.12.38 內核偏移)</span></div></div><div><div><div>3</div></div><div><span>├── 2_Fastboot_Unlock_Files/       # 解鎖關鍵 (高通簽名 abl.img, superfastboot efisp.img)</span></div></div><div><div><div>4</div></div><div><span>├── 3_Root_Managers/               # Root 管理器 (SukiSU v4.3.0-r2)</span></div></div><div><div><div>5</div></div><div><span>├── 4_TWRP_Recovery/               # TWRP-16-OPAce6T-NkBe918-V1.3.img &amp; stock_recovery_16.0.10.500.img</span></div></div><div><div><div>6</div></div><div><span>├── 5_Flash_Scripts/               # 刷入與還原輔助腳本</span></div></div><div><div><div>7</div></div><div><span>└── 7_Recommended_Tools/           # 內建推薦工具 (含 Shizuku v13.6.2 正式版)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://www.nkbe.top/posts/nyazygisk-webui-guide/</id>
      <title type="text">NyaZygisk WebUI 使用說明：每個功能是做什麼的、怎麼用</title>
      <published>2026-10-21T00:00:00.000Z</published>
      <updated>2026-10-21T00:00:00.000Z</updated>
      <author><name>NkBe</name></author>
      <link rel="alternate" href="https://www.nkbe.top/posts/nyazygisk-webui-guide/"/>
      <summary type="text">逐項說明 NyaZygisk WebUI 的狀態總覽、裝置資訊、模組清單、匿名記憶體、自訂鏈接器、應用排除與語言切換，以及狀態異常時該怎麼判讀。</summary>
      <content type="html"><![CDATA[<p>NyaZygisk 裝好之後，不用開終端機也能確認它有沒有正常運作，還能針對單一 App 關掉 Zygisk 模組。這些都在模組自帶的 WebUI 裡完成。這篇把 WebUI 的每個區塊說明一遍：它顯示什麼、資料從哪來、每個開關改了什麼。</p>
<p>先說結論：WebUI 只有兩個分頁，<strong>概覽</strong>（看狀態、看模組、三個設定）和<strong>應用排除</strong>（挑 App 不載入模組）。日常只會用到後者。</p>
<div><div><div></div><div>Note</div></div><div><p>本文依據 NyaZygisk 倉庫的 <code>module/src/webroot/</code>（前端）與 <code>zygiskd</code>、<code>loader</code>（讀取設定的一端）原始碼整理，截稿時我沒有逐項在實機上重新操作一遍，介面文字以原始碼內的字串為準。如果你的版本和描述不一致，以實際畫面為準。</p></div></div>
<hr />
<section><h2>🚪 怎麼打開<a href="#-怎麼打開"><span>#</span></a></h2><ol>
<li>在 Root 管理器（KernelSU / APatch）的模組頁找到 <strong>NyaZygisk</strong>，點模組卡片上的 WebUI 入口（通常是個「開啟」或網頁圖示的按鈕）。</li>
<li>Magisk 本身沒有 WebUI 入口，要用支援 WebUI 的第三方管理器開。前端內建的橋接介面有 <code>window.kernelsu</code>、<code>KernelSU</code>、<code>WebUIX</code>、<code>apatch</code>、<code>mmrl</code> 這幾種，偵測不到任何一種時，頁面會跳出「找不到支援的 WebUI bridge」。</li>
</ol><p>WebUI 所有資料都是透過管理器提供的 <code>exec</code> 介面，以 root 身分執行 shell 命令取得的，不是靠網路，離線也能用。</p><hr /></section>
<section><h2>📊 分頁一：概覽<a href="#-分頁一概覽"><span>#</span></a></h2><section><h3>頂部：版本與重新整理<a href="#頂部版本與重新整理"><span>#</span></a></h3><p>標題下方的小字是 <code>NyaZygisk 版本 · Root 方案與版本</code>，例如 <code>v2.5 · KernelSU …</code>。右上角的圓形箭頭是<strong>重新整理</strong>，會重新讀取所有狀態並重新載入應用清單，成功後底部會彈出「已重新整理」。</p></section><section><h3>狀態卡片：Zygisk 現在到底有沒有在運作<a href="#狀態卡片zygisk-現在到底有沒有在運作"><span>#</span></a></h3><p>最上面的大卡片用顏色和圖示直接告訴你結論，下面列出三個組件的狀態：</p>

<table><thead><tr><th>組件</th><th>含義</th></tr></thead><tbody><tr><td><strong>Zygote 監控</strong>（Zygote Monitor）</td><td>盯著 Zygote 進程、負責注入的監控組件，它停了就不會有注入</td></tr><tr><td><strong>Zygote</strong>（會標示 64-bit / 32-bit）</td><td>Zygote 進程有沒有被注入</td></tr><tr><td><strong>守護進程</strong>（Daemon）</td><td><code>zygiskd</code>，負責給模組提供檔案、companion 等服務</td></tr></tbody></table><p>每個組件的狀態字樣分兩類：</p><ul>
<li>正常（綠）：<code>運行中</code>、<code>已注入</code>、<code>追蹤中</code></li>
<li>異常（紅）：<code>已停止</code>、<code>已退出</code>、<code>已崩潰</code>、<code>未注入</code></li>
<li>其他（灰）：<code>未知</code></li>
</ul><p>大卡片的總結按下面的規則決定，這是前端 <code>overallTone</code> 的邏輯：</p>

<table><thead><tr><th>卡片</th><th>條件</th><th>怎麼辦</th></tr></thead><tbody><tr><td>✅ 運行正常</td><td>三個組件全部正常</td><td>不用管</td></tr><tr><td>⚠️ 部分異常</td><td>監控與 Zygote 都沒問題，但別的組件異常（通常是守護進程）</td><td>模組可能載入不了，先重新整理，再重開機</td></tr><tr><td>❌ 未運行</td><td>監控或 Zygote 有一個異常</td><td>Zygisk 沒生效，重開機；仍然不行就收集 debug 日誌回報</td></tr><tr><td>❔ 狀態未知</td><td>讀不到狀態，或剛裝好還沒重開機</td><td>重開機後再看；若同時出現橋接錯誤，換一個支援 WebUI 的管理器</td></tr></tbody></table><div><div><div></div><div>Tip</div></div><div><p>裝完模組、重開機之後，第一件事就是開 WebUI 看這張卡片。README 的安裝步驟最後一步也是這個。</p></div></div></section><section><h3>裝置與環境<a href="#裝置與環境"><span>#</span></a></h3><p>這張卡片列出：</p><ul>
<li><strong>Root 方案</strong>：偵測 APatch / FolkPatch / KernelSU / Magisk，能取得版本時一併顯示。做法是檢查 <code>apd</code>、<code>fpd</code>、<code>magiskd</code> 進程與 <code>/data/adb/ksu</code> 目錄，SukiSU 這類會顯示為 KernelSU 或 SukiSU。</li>
<li><strong>系統</strong>：只有偵測到廠商 ROM 才會出現。目前認得 ColorOS / OxygenOS、HyperOS、MIUI、One UI，版本取自各家的系統屬性。AOSP 類系統這格會隱藏。</li>
<li><strong>內核</strong>、<strong>Android SDK</strong>、<strong>ABI</strong>：直接讀自守護進程回報的資料。</li>
</ul><p>回報問題時，把這張卡片截圖附上最省事，維護者不用再追問你的環境。</p></section><section><h3>已啟用模組<a href="#已啟用模組"><span>#</span></a></h3><p>列出目前<strong>啟用中</strong>、並且是 Zygisk 或 ZN 模組的項目，右上角的數字是總數。每個模組顯示名稱、版本、說明、作者，以及標籤：</p><ul>
<li><code>Zygisk</code>：走 Magisk Zygisk API 的模組（例如 LSPosed 這一類）</li>
<li><code>ZN</code>：走 Zygisk Next API 的模組。若它的注入目標不是 zygote，會多顯示一行「目標：xxx」</li>
<li><code>Companion</code>：這個模組有使用 companion 進程</li>
</ul><p>清單的來源是兩份資料合併：</p><ol>
<li>掃描 <code>/data/adb/modules/*</code>，跳過有 <code>disable</code> 或 <code>remove</code> 標記的目錄，只保留含有 <code>zygisk/&lt;abi&gt;.so</code> 或 <code>zn_modules.txt</code> 的模組，並讀它的 <code>module.prop</code>。</li>
<li>守護進程回報的模組清單，補上類型（Zygisk / ZN）、目標和 companion 資訊。</li>
</ol><p>所以如果某個模組沒出現在這裡，先檢查它是不是被停用了，或者它根本不是 Zygisk 模組（沒有 <code>zygisk/</code> 目錄也沒有 <code>zn_modules.txt</code>）。反過來，剛啟用還沒重開機的模組，可能已經在清單裡但還沒真正載入，要以重開機後的狀態為準。</p></section><section><h3>設定<a href="#設定"><span>#</span></a></h3><p><strong>匿名記憶體（Anonymous memory）</strong>——「特化後隱藏模組的記憶體映射」，預設關閉。</p><p>打開後，App 進程完成特化（specialize）之後，NyaZygisk 會把 <code>/proc/self/maps</code> 裡由模組產生的映射（路徑名含 <code>jit-cache-zygisk</code>、<code>zygisk-module</code>、<code>zn-module</code> 的私有映射）改成匿名映射，同時把 rwx 的映射去掉寫入權限。目的是讓偵測 App 掃描 maps 時，看不到這些帶有模組特徵的名字。</p><ul>
<li>適合：你的 App 會掃 maps 找 Zygisk 痕跡，且你已經確認需要這個功能。</li>
<li>不適合：沒有這種需求的情況不用開。它會改動進程的記憶體屬性，有用戶反饋開啟後出現過系統介面進不去、狀態顯示 <code>Monitor: NO</code> 等問題。遇到類似狀況，先把它關掉確認是不是原因。</li>
<li>開關改動後即寫入設定，<strong>對之後啟動的 App 進程生效</strong>，已經在跑的 App 要重新啟動。</li>
</ul><p><strong>自訂鏈接器（Custom linker）</strong>——「不經過系統鏈接器載入模組（實驗性）」，預設關閉。</p><p>一般情況下，模組是交給系統的動態鏈接器（<code>android_dlopen_ext</code>）載入的，載入後會登記在鏈接器的 solist 裡。打開這個開關後，NyaZygisk 改用自己內建的 ELF 載入器把模組映射進記憶體並完成重定位，模組不會進入系統鏈接器的紀錄；搭配匿名記憶體時，還能直接映射成匿名頁面，不留下 memfd 的名字。</p><ul>
<li>適合：想進一步減少模組在系統鏈接器裡留下的痕跡，並且願意承擔實驗性功能風險的人。</li>
<li>不適合：一般使用。它是實驗功能，所以預設不啟用。載入失敗或遇到不支援的模組時，會自動退回系統鏈接器；但如果開啟後出現閃退或模組異常，請先關掉它再回報。</li>
<li>同樣<strong>對之後啟動的 App 進程生效</strong>。想確認模組是由哪個載入器載入的，可以用 debug 版看日誌裡的 <code>modloader:</code> 紀錄。</li>
<li>從 v2.5-r2 起，沒有設定這個鍵時視為關閉；先前版本在沒設定時是開啟的，更新後如果還要用，需要在 WebUI 重新打開。</li>
</ul><p><strong>語言（Language）</strong>——EN / 繁中 / 简中，切換後立刻生效，選擇記在 WebUI 自己的本機儲存裡，不影響模組本身。</p><hr /></section></section>
<section><h2>🛡️ 分頁二：應用排除<a href="#️-分頁二應用排除"><span>#</span></a></h2><p>這是 WebUI 裡最實用的功能：<strong>勾選的 App 完全不載入任何 Zygisk 模組</strong>。</p><p>典型場景：</p><ul>
<li>某個 App 偵測到 Zygisk 或 Hook 就拒絕運行或封號，又不需要任何模組的功能。</li>
<li>某個模組對特定 App 造成閃退，你想先把那個 App 排除掉而不是停用整個模組。</li>
</ul><section><h3>怎麼用<a href="#怎麼用"><span>#</span></a></h3><ol>
<li>切到底部的<strong>應用排除</strong>分頁（分頁標籤上的數字是目前已排除的 App 數量）。</li>
<li>在列表裡找到目標 App：
<ul>
<li>搜尋框支援依<strong>名稱或套件名</strong>搜尋；</li>
<li>上方有「<strong>全部</strong> N / <strong>已排除</strong> N」兩個篩選，可以只看已排除的。</li>
</ul>
</li>
<li>打開該 App 右側的開關。每次切換都會立刻儲存，並彈出「已儲存」。</li>
<li><strong>重新啟動那個 App</strong>（建議從最近任務裡徹底滑掉再開）。排除只在 App 下次啟動時生效，已經在跑的進程不受影響。尚未生效的項目旁邊會顯示「<strong>待重啟</strong>」標籤。</li>
</ol><p>列表中已排除的項目會排在最前面，其餘依名稱排序。切換時列的位置不會跳走，所以連續勾選多個不會點錯。</p></section><section><h3>「同時卸載模組掛載」<a href="#同時卸載模組掛載"><span>#</span></a></h3><p>分頁上方的這個開關（<code>Unmount for excluded apps</code>），<strong>預設開啟</strong>。</p><ul>
<li>開：被排除的 App 除了不載入模組之外，還會像 DenyList 一樣，把 Root 與模組的掛載從它的 mount namespace 裡卸掉。</li>
<li>關：只是不載入模組，掛載痕跡不處理。</li>
</ul><p>也就是說，開著這個開關時，勾選一個 App 的效果等於「既不讓模組進去，又讓它看不到掛載」。如果你本來就用 Root 管理器的「卸載模組」功能（APatch / KernelSU）或 Magisk 的 DenyList 處理過這個 App，這個開關和它們是並行的，不衝突。</p><div><div><div></div><div>Important</div></div><div><p>應用排除和 DenyList 不是同一個東西：DenyList 管的是<strong>掛載</strong>（Zygisk 模組還是會被載入），應用排除管的是<strong>模組載入</strong>（再加上可選的卸載掛載）。要徹底把 App 隔離在模組之外，用應用排除並保持「同時卸載模組掛載」開啟。</p></div></div></section><section><h3>它的限制<a href="#它的限制"><span>#</span></a></h3><p>介面頂部的提示已經寫了，這裡再展開：</p><ul>
<li><strong>只列出使用者安裝的 App</strong>（<code>pm list packages -3</code>）。系統 App 不會出現，也不能排除，這是刻意的：<code>system_server</code> 和系統 UID 永遠不受影響，避免把系統搞壞。</li>
<li><strong>共用 UID 的 App 會一起切換。</strong> 如果多個套件共用同一個 UID，排除其中一個等於排除全部，列表裡會標出「與另外 N 個套件共用 UID，會一起切換」。</li>
<li><strong>與系統套件共用 UID 的 App 無法排除。</strong> 這類項目開關是灰的，並註明「與系統套件共用 UID，無法排除」。原因是守護進程只有在同一 UID 下所有套件都在排除清單裡才會排除，而系統套件不允許被列進去。</li>
<li><strong>已解除安裝的套件會被自動清掉</strong>，不會留下看不見的殘留項目。</li>
<li>顯示 App 名稱需要管理器提供套件資訊介面（KernelSU 系的 WebUI 有）；沒有時只顯示套件名，功能不受影響。</li>
</ul><hr /></section></section>
<section><h2>🧰 常見狀況<a href="#-常見狀況"><span>#</span></a></h2>

<table><thead><tr><th>現象</th><th>可能原因與處理</th></tr></thead><tbody><tr><td>打開後全是 <code>-</code> 和「狀態未知」，彈出「找不到支援的 WebUI bridge」</td><td>用的管理器沒有提供 <code>exec</code> 介面，換成 KernelSU / APatch 自帶的入口，或支援 WebUI 的第三方管理器</td></tr><tr><td>狀態是「部分異常」</td><td>守護進程沒起來，先重新整理，再重開機；仍異常就用 debug 版收集日誌</td></tr><tr><td>「未運行」</td><td>Zygisk 沒生效。確認沒有同時安裝別的 Zygisk 實作（NeoZygisk、ReZygisk、Zygisk Next），Magisk 用戶要關閉內建 Zygisk</td></tr><tr><td>模組清單是空的</td><td>模組沒啟用，或不是 Zygisk / ZN 模組</td></tr><tr><td>勾選排除後 App 還是載入了模組</td><td>沒有重啟該 App，或該 App 與系統套件共用 UID（開關是灰的）</td></tr><tr><td>彈出「儲存設定失敗」</td><td>寫入 <code>config.prop</code> 失敗，開關會自動彈回原狀態，檢查管理器是否給了 WebUI root 權限</td></tr></tbody></table><hr /></section>
<section><h2>🔧 給進階使用者：設定存在哪<a href="#-給進階使用者設定存在哪"><span>#</span></a></h2><p>WebUI 的所有設定都是寫進同一個檔案：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/data/adb/nyazygisk/config.prop</span></div></div></code></pre><div><div></div><div></div></div></figure></div>

<table><thead><tr><th>鍵</th><th>值</th><th>含義</th></tr></thead><tbody><tr><td><code>anonymous_memory</code></td><td><code>1</code> / <code>0</code></td><td>匿名記憶體，沒有這個鍵視為關閉</td></tr><tr><td><code>custom_linker</code></td><td><code>1</code> / <code>0</code></td><td>自訂鏈接器，沒有這個鍵視為關閉（只有 <code>1</code> 才啟用）</td></tr><tr><td><code>exclude_unmount</code></td><td><code>1</code> / <code>0</code></td><td>同時卸載模組掛載，沒有這個鍵視為開啟</td></tr><tr><td><code>exclude_apps</code></td><td><code>pkg1,pkg2,...</code></td><td>排除的套件名，逗號分隔</td></tr></tbody></table><p>WebUI 寫入時只改自己的那一個鍵、其餘保留，並且先寫暫存檔再改名，避免寫到一半被讀到。守護進程會監看這個檔案的修改時間，變動後自動清掉快取，所以<strong>不用重啟守護進程</strong>，在 WebUI 之外手動編輯也一樣生效（同樣是對之後啟動的進程生效）。</p><hr /></section>
<section><h2>小結<a href="#小結"><span>#</span></a></h2><ul>
<li>裝完先看<strong>概覽</strong>的狀態卡片：綠色就是 Zygisk 正常。</li>
<li>模組清單用來確認「我的模組有沒有真的被識別、被當成哪一類」。</li>
<li><strong>應用排除</strong>是主要的日常功能：勾選 → 重啟該 App；想連掛載也藏掉就保持「同時卸載模組掛載」開著。</li>
<li><strong>匿名記憶體</strong>只有在 App 會掃 maps 的時候才需要開。</li>
<li><strong>自訂鏈接器</strong>是實驗功能，預設關閉；開啟後若出問題，先關掉再回報。</li>
</ul><p>如果你發現說明和實際行為不符，或有想要的功能，歡迎到 <a href="https://github.com/HSSkyBoy/NyaZygisk" target="_blank">GitHub</a> 開 issue，或到 Telegram 頻道 <a href="https://t.me/NYAZYGISK" target="_blank">@NyaZygisk</a> 反映。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://www.nkbe.top/posts/zygisk-implementations-compare/</id>
      <title type="text">Zygisk 實作怎麼選：多個 Zygisk 實作的詳細對比</title>
      <published>2026-10-18T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>NkBe</name></author>
      <link rel="alternate" href="https://www.nkbe.top/posts/zygisk-implementations-compare/"/>
      <summary type="text">逐項對照 Zygisk Next、NyaZygisk、NeoZygisk、ReZygisk、ZNNext 的 API、注入方式、隱藏機制、平台適配與維護狀況，並說明 NyaZygisk 的定位與取捨。</summary>
      <content type="html"><![CDATA[<p>在 KernelSU、APatch 上用 Zygisk 模組，或者想替換 Magisk 內建的 Zygisk，現在有好幾個選擇。它們名字相近，能力卻差很多，有的甚至不是同一類東西。</p>
<p>先說結論：<strong>如果你想要一個開源、裝一個就能同時跑 Zygisk 模組與 Zygisk Next 模組、並且把「精簡」和「隱藏」當成首要目標的方案，推薦 NyaZygisk</strong>。下文逐項對照每個專案實際做了什麼、沒做什麼，NyaZygisk 不適合的情況也會寫出來，你可以對照自己的需求確認。</p>
<div><div><div></div><div>Note</div></div><div><p><strong>利益揭露</strong>：我是 NyaZygisk 的維護者，所以這篇會推薦它。但比較的部分只寫能在原始碼或官方文件裡找到依據的事實，NyaZygisk 的限制也一併寫出。</p><p><strong>資料來源</strong>：各倉庫 2026-10-20 取得的預設分支原始碼、README 與 GitHub 資料。Zygisk Next 已閉源，它的資訊只來自官方 README、API 文件與發佈頁，無法核實內部實作，下文凡是這種情況都會標明。「原始碼中沒有找到」只代表我讀過相關程式碼沒看到實作，不等於一定不支援。</p></div></div>
<hr />
<section><h2>🧭 先釐清：這五個不是同一類東西<a href="#-先釐清這五個不是同一類東西"><span>#</span></a></h2><p>講「Zygisk」時，其實混了兩套不同的模組 API：</p><ul>
<li><strong>Magisk Zygisk API</strong>：Magisk 定義的模組介面（入口 <code>zygisk_module_entry</code>），LSPosed 等大多數 Zygisk 模組都用這套。目前最新版本是 v5。</li>
<li><strong>Zygisk Next API（ZN API）</strong>：Zygisk Next 閉源之後自己新增的介面（入口 <code>zn_module</code>，用 <code>zn_modules.txt</code> 登記）。它可以注入由 init 啟動的進程，提供 inline / PLT hook 與符號解析介面，還有 HyperOS Rust Runtime 的回呼。</li>
</ul><p>各專案對兩套 API 的支援不同：</p><ul>
<li><strong>Zygisk Next</strong> 兩套都支援，是 ZN API 的原始定義者，但已閉源。</li>
<li><strong>NyaZygisk</strong> 兩套都支援，是目前<strong>唯一同時支援兩套 API 的開源實作</strong>。</li>
<li><strong>NeoZygisk</strong>、<strong>ReZygisk</strong> 只實作 Magisk Zygisk API。</li>
<li><strong>ZNNext</strong>（原名 ZygiskNextNext）只載入 ZN 模組，<strong>本身不是 Zygisk 實作</strong>，要用 Zygisk 模組得另外裝一個。</li>
</ul><hr /></section>
<section><h2>📋 總覽<a href="#-總覽"><span>#</span></a></h2>

<table><thead><tr><th></th><th>Zygisk Next</th><th>NyaZygisk</th><th>NeoZygisk</th><th>ReZygisk</th><th>ZNNext</th></tr></thead><tbody><tr><td><strong>維護者</strong></td><td>Dr-TSNG（LSPosed）</td><td>HSSkyBoy / NkBe</td><td>JingMatrix</td><td>PerformanC</td><td>VeryBaaad</td></tr><tr><td><strong>與其他專案的關係</strong></td><td>原始專案</td><td>fork 自 NeoZygisk</td><td>延續 Zygisk Next 開源時期的程式碼（2024-12 改名）</td><td>fork 自 Zygisk Next 開源時期，以 C 重寫</td><td>從零實作的 ZN 模組載入器</td></tr><tr><td><strong>授權</strong></td><td>閉源（v4-0.9.2 起）</td><td>GPL-3.0</td><td>GPL-3.0</td><td>AGPL-3.0</td><td>GPL-3.0</td></tr><tr><td><strong>能否審計原始碼</strong></td><td>❌</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td></tr><tr><td><strong>Magisk Zygisk API</strong></td><td>✅</td><td>✅ v5</td><td>✅ v5</td><td>✅ v5</td><td>❌</td></tr><tr><td><strong>ZN API</strong></td><td>✅</td><td>✅ v4</td><td>❌</td><td>❌</td><td>✅ v4</td></tr><tr><td><strong>HyperOS Runtime API</strong></td><td>✅</td><td>✅ v1</td><td>❌</td><td>❌</td><td>✅ v1</td></tr><tr><td><strong>單一模組即可跑兩類模組</strong></td><td>✅</td><td>✅</td><td>❌</td><td>❌</td><td>❌</td></tr><tr><td><strong>主要語言</strong></td><td>未公開</td><td>C++ + Rust</td><td>C++ + Rust</td><td>C</td><td>C++ + Rust（injector）</td></tr><tr><td><strong>最低 Android</strong></td><td>8.0</td><td>7.1</td><td>8.0</td><td>7.1</td><td>5.0</td></tr><tr><td><strong>架構</strong></td><td>arm64、armv7、x86、x86_64、riscv64</td><td>arm64、armv7、x86_64、riscv64</td><td>arm64、armv7、x86、x86_64</td><td>arm64、armv7、x86、x86_64</td><td>arm64、armv7、x86、x86_64、riscv64</td></tr><tr><td><strong>WebUI</strong></td><td>有（README 提到翻譯）</td><td>有</td><td>無</td><td>有</td><td>有</td></tr><tr><td><strong>最新釋出版本</strong></td><td>v1.5.2（2026-10-15）</td><td>v2.5-r1（2026-10-23）</td><td>v2.4（2026-08-08）</td><td>v1.0.0（2026-05-10）</td><td>v2.2.0（2026-10-24）</td></tr><tr><td><strong>近三個月提交數</strong>¹</td><td>5</td><td>36</td><td>9</td><td>29</td><td>216</td></tr><tr><td><strong>GitHub Stars</strong>¹</td><td>10.7k</td><td>286</td><td>2.5k</td><td>4.1k</td><td>65</td></tr></tbody></table><blockquote><p>¹ 取自 GitHub，統計區間為 2026-07-20 至 2026-10-20。「最新釋出版本」一列於 2026-10-25 更新。Zygisk Next 的提交數只計公開倉庫，它的原始碼不公開，所以這個數字不代表實際開發量。</p></blockquote><div><div><div></div><div>Note</div></div><div><p>「最低 Android」「架構」取自各專案安裝腳本、建置設定或公開說明。架構欄是依專案釋出與社群實測彙整。</p></div></div><p>Stars 與提交數只是側面參考：Stars 反映知名度與使用者基數，提交數反映開發活躍度，兩者都不等於穩定或好用。NyaZygisk 的使用者基數相對小，這是客觀事實，意味著問題回饋與社群經驗都比 NeoZygisk、ReZygisk 少。</p><hr /></section>
<section><h2>🔒 開源這件事為什麼重要<a href="#-開源這件事為什麼重要"><span>#</span></a></h2><p>Zygisk 實作以 root 權限執行，能注入每一個應用進程。它做什麼、收集什麼，原則上只有看得到原始碼才能確認。</p><p>Zygisk Next 從 v4-0.9.2 起改為保留所有權利，授權明確禁止修改、再散佈，以及拆出任何部分用在其他專案。ReZygisk 的 README 把這點講得很直接：閉源讓社群無法貢獻，也無法審計，對一個 root 級別的模組來說是重大的安全疑慮。</p><p>Zygisk Next 的開發者在社群裡有很好的信譽，這篇不是在質疑他們。但如果你的原則是「root 權限的元件必須可審計」，那 Zygisk Next 就不在選項內。</p><p>這也是 NyaZygisk 存在的主要理由：<strong>在開源方案裡，想同時用 Zygisk 模組與 ZN 模組，過去只能是「NeoZygisk / ReZygisk + ZNNext」兩個模組疊在一起</strong>；NyaZygisk 把兩套 API 放進同一個 GPL-3.0 的實作裡，裝一個就夠。</p><hr /></section>
<section><h2>🔬 逐項對照<a href="#-逐項對照"><span>#</span></a></h2><section><h3>1. 注入方式與模組載入<a href="#1-注入方式與模組載入"><span>#</span></a></h3>

<table><thead><tr><th></th><th>NyaZygisk</th><th>NeoZygisk</th><th>ReZygisk</th><th>ZNNext</th></tr></thead><tbody><tr><td>注入目標進程的方式</td><td><code>ptrace</code> 遠端呼叫 <code>dlopen</code> 載入 <code>libzygisk.so</code></td><td>同左</td><td><code>ptrace</code> + 自製遠端 linker（CSOLoader），不經過系統 linker</td><td>獨立的 injector 常駐進程，用 <code>ptrace</code></td></tr><tr><td>發現目標進程的方式</td><td>監控 <code>execve</code>，辨識 Zygote 與 <code>hyos_spawner</code></td><td>監控 <code>execve</code>，辨識 Zygote</td><td>監控 Zygote</td><td>tracefs <code>sched_process_exec</code>、proc connector、eBPF、fanotify、KPM，都不可用時退回 <code>/proc</code> 輪詢</td></tr><tr><td>載入 Zygisk 模組</td><td>daemon 為每個模組建立密封的唯讀 memfd，進程用 <code>android_dlopen_ext</code> 從 fd 載入</td><td>同左</td><td>自製 linker 載入</td><td>不適用</td></tr><tr><td>載入 ZN 模組</td><td>依 <code>zn_modules.txt</code>，同樣經 memfd 載入</td><td>不支援</td><td>不支援</td><td>依 <code>zn_modules.txt</code> 載入</td></tr><tr><td>ZN 模組可注入的目標</td><td><strong>Zygote、<code>hyos_spawner</code></strong></td><td>—</td><td>—</td><td><strong><code>name=</code> / <code>path=</code> 指定的任意 init 啟動進程</strong></td></tr><tr><td>進程旗標查詢</td><td>daemon 以共享記憶體（memfd + mmap）快取，其餘走 IPC</td><td>每次 IPC 查詢</td><td>IPC</td><td>不適用</td></tr><tr><td>Hook 後端</td><td>Dobby（riscv64 上改用 rv64hook）、LSPlt</td><td>LSPlt</td><td>PLTI</td><td>Dobby、ShadowHook、rv64hook、And64InlineHook；LSPlt、PLTI、ByteHook、xHook，可選擇</td></tr></tbody></table><p>幾點說明：</p><ul>
<li>NyaZygisk 與 NeoZygisk 的注入流程基本一致（這是 fork 關係），差別主要在 Nya 多了 <code>hyos_spawner</code> 目標與 ZN 載入器。</li>
<li>ReZygisk 的取向不同：它不使用系統 linker，目的是對抗基於 linker 的檢測（例如檢查 <code>solist</code>）。這和 Neo / Nya「用系統 linker 載入、事後清理痕跡」是兩種思路，沒有絕對優劣。</li>
<li>ZNNext 的目標發現方式最多元，對核心要求最低，這是它支援 Android 5.0 與 riscv64 的原因之一。</li>
<li>NyaZygisk 的 ZN 注入範圍是<strong>真實的功能缺口</strong>：daemon 雖然會解析 <code>path=</code>，但進程監控只攔截 Zygote 與 <code>hyos_spawner</code>，所以指定注入其他系統守護進程的 ZN 模組不會生效。</li>
</ul></section><section><h3>2. 隱藏與痕跡處理<a href="#2-隱藏與痕跡處理"><span>#</span></a></h3><p>下表只比較<strong>原始碼中能確認存在的實作</strong>。「—」代表我在原始碼裡沒有找到對應實作。</p>

<table><thead><tr><th>項目</th><th>NyaZygisk</th><th>NeoZygisk</th><th>ReZygisk</th></tr></thead><tbody><tr><td>DenyList 應用的 mount namespace</td><td>Zygote 內直接卸載，失敗或被中止則 <code>setns</code> 切換到快取的乾淨 namespace</td><td>同左</td><td><code>setns</code> 切換到 daemon 準備的 Clean / Mounted namespace</td></tr><tr><td>偵測到關鍵 overlay 時放棄直接卸載</td><td>✅（如 <code>/product</code>）</td><td>✅</td><td>—</td></tr><tr><td>為所有 isolated 進程提供一致的 mount 視圖</td><td>✅</td><td>✅</td><td>—</td></tr><tr><td>卸載模組後清除 linker 內的痕跡（<code>solist</code>）</td><td>✅</td><td>✅</td><td>不適用（不經系統 linker）</td></tr><tr><td>清除 libc / linker 載入痕跡、<code>fossil</code> 偽裝</td><td>✅</td><td>✅</td><td>—</td></tr><tr><td>卸載動作自身留下的痕跡</td><td>✅</td><td>✅（v2.4 之後的提交 #161）</td><td>—</td></tr><tr><td>清除 <code>ptrace_message</code></td><td>✅（seccomp / <code>PTRACE_SYSCALL</code> 混合）</td><td>✅</td><td>✅（seccomp）</td></tr><tr><td>DenyList 應用移除 release 日誌</td><td>✅</td><td>✅</td><td>—</td></tr><tr><td>模組記憶體映射匿名化（maps）</td><td>✅ 可選，需在 WebUI 開啟「匿名記憶體」</td><td>—</td><td>—</td></tr><tr><td>CFI shadow 同步處理</td><td>✅</td><td>—</td><td>—</td></tr><tr><td><code>TracerPid</code> 清理</td><td>✅（FD 追蹤，hook <code>open</code> / <code>openat</code> / <code>close</code> / <code>read</code>）</td><td>—</td><td>—</td></tr><tr><td>系統屬性欺騙（<code>spoof.prop</code>）</td><td>✅</td><td>—</td><td>—</td></tr><tr><td>逐應用的模組排除清單</td><td>✅</td><td>—</td><td>—</td></tr><tr><td>接管 KernelSU 的 <code>kernel_umount</code></td><td>✅</td><td>✅</td><td>—</td></tr></tbody></table><p>幾點說明：</p><ul>
<li><strong>Nya 的隱藏處理是疊加在 Neo 之上的</strong>。表中標 ✅ 且 NeoZygisk 也有的項目，是 Nya 從上游繼承的；Nya 自己新增的是匿名記憶體、CFI shadow、<code>TracerPid</code>、屬性欺騙和逐應用排除。</li>
<li><strong><code>TracerPid</code> 清理有範圍限制</strong>：它只 hook <code>libandroid_runtime</code>、<code>libart</code>、<code>libjavacore</code>、<code>libopenjdk</code>、<code>libbase</code> 這幾個庫的 PLT，攔截的是經由它們讀取 <code>/proc/*/status</code> 的路徑，不涵蓋應用自己的 native 程式碼直接發出的系統呼叫。</li>
<li><strong>匿名記憶體預設不啟用</strong>，因為它會改動映射，需要使用者自己在 WebUI 裡開啟。</li>
<li><strong>屬性欺騙會改變系統屬性的回傳值</strong>，預設的 <code>spoof.prop</code> 涵蓋 Bootloader 狀態、build type、debuggable 旗標，以及 MIUI、Realme、OPlus 的專屬屬性；<code>ro.boot.vbmeta.digest</code> 每次載入時隨機產生。不需要的人可以刪掉相應行。</li>
<li>ReZygisk 在隱藏上選擇了「根本不碰系統 linker」的路線，所以沒有 <code>solist</code> 清理；它在 <code>TracerPid</code>、屬性欺騙、maps 偽裝這幾項我沒有找到對應實作。</li>
<li>Zygisk Next 和 ZNNext 是否有同類處理，Zygisk Next 無法核實；ZNNext 的隱藏重點在注入器本身的行為，與上表的 Zygisk 實作面向不同，這裡不做逐項比較。</li>
<li><strong>沒有任何一個專案能保證通過所有檢測</strong>，我也沒有逐機型、逐應用實測。</li>
</ul></section><section><h3>3. 平台與環境適配<a href="#3-平台與環境適配"><span>#</span></a></h3>

<table><thead><tr><th></th><th>NyaZygisk</th><th>NeoZygisk</th><th>ReZygisk</th><th>ZNNext</th></tr></thead><tbody><tr><td>APatch / KernelSU / Magisk</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td></tr><tr><td>KernelSU Next 等變體辨識</td><td>✅</td><td>✅</td><td>✅</td><td>未逐項核實</td></tr><tr><td>Magisk Alpha / Kitsune 辨識</td><td>✅</td><td>✅</td><td>未找到</td><td>未逐項核實</td></tr><tr><td>KernelSU LKM 後載入（late-load）</td><td>✅</td><td>—</td><td>—</td><td>—</td></tr><tr><td>KernelSU 模擬軟重啟（臨時 root）</td><td>✅</td><td>—</td><td>—</td><td>✅（含 <code>emulated-soft-reboot.sh</code>）</td></tr><tr><td>HyperOS <code>hyos_spawner</code></td><td>✅</td><td>—</td><td>—</td><td>✅</td></tr><tr><td>Android 17 Zygote 簽名</td><td>✅（繼承上游）</td><td>✅</td><td>未逐項核實</td><td>未逐項核實</td></tr><tr><td>BTI 設備</td><td>✅（繼承上游）</td><td>✅</td><td>未逐項核實</td><td>未逐項核實</td></tr><tr><td>32 位元 PLT hook 修正</td><td>✅（繼承上游）</td><td>✅</td><td>不適用</td><td>不適用</td></tr></tbody></table></section><section><h3>4. 管理介面<a href="#4-管理介面"><span>#</span></a></h3>

<table><thead><tr><th></th><th>NyaZygisk</th><th>NeoZygisk</th><th>ReZygisk</th><th>ZNNext</th></tr></thead><tbody><tr><td>WebUI</td><td>✅ 分頁式：概覽、模組、設定</td><td>—</td><td>✅</td><td>✅ Vue 3，兩套外觀</td></tr><tr><td>多語言</td><td>繁中、簡中、英文</td><td>—</td><td>透過 Crowdin 翻譯</td><td>未逐項核實</td></tr><tr><td>區分模組類型（Zygisk / Next）</td><td>✅</td><td>不適用</td><td>不適用</td><td>不適用</td></tr><tr><td>顯示 ROM、核心、ABI、SDK</td><td>✅</td><td>—</td><td>未逐項核實</td><td>未逐項核實</td></tr><tr><td><code>action.sh</code> 狀態輸出</td><td>—</td><td>✅</td><td>未逐項核實</td><td>未逐項核實</td></tr></tbody></table><hr /></section></section>
<section><h2>🔍 各專案小結<a href="#-各專案小結"><span>#</span></a></h2><section><h3>Zygisk Next<a href="#zygisk-next"><span>#</span></a></h3><ul>
<li><strong>優勢</strong>：兩套 API 都支援，ZN 模組可以注入任意由 init 啟動的進程；HyperOS Runtime API 由它提出；新的 ZN 模組通常以它為首要測試對象；活躍維護，v1.5.2 剛在 2026-10-15 釋出。</li>
<li><strong>限制</strong>：閉源，無法審計，也不能被修改或 fork。</li>
</ul></section><section><h3>NyaZygisk<a href="#nyazygisk"><span>#</span></a></h3><ul>
<li><strong>優勢</strong>：
<ul>
<li>開源，且單一模組同時載入 Magisk Zygisk 模組（v5）、ZN 模組（v4）與 HyperOS Runtime 模組（v1）；</li>
<li>在 NeoZygisk 的 DenyList 基礎上疊加了 <code>TracerPid</code>、屬性欺騙、匿名記憶體、CFI shadow 與逐應用排除；</li>
<li>支援 KernelSU LKM 後載入與模擬軟重啟；</li>
<li>最低支援 Android 7.1，比上游 NeoZygisk 的 8.0 更低；</li>
<li>v2.5-r1 起支援 riscv64（需 Android 15 以上），ZN 的 inline hook 在 riscv64 上由 rv64hook 提供；</li>
<li>有 WebUI，可以區分 <code>[Zygisk]</code> / <code>[Next]</code> 模組並設定逐應用排除。</li>
</ul>
</li>
<li><strong>限制</strong>：
<ul>
<li><strong>ZN 模組只會注入 Zygote 與 <code>hyos_spawner</code></strong>；</li>
<li>不支援 32 位元 x86，最低 Android 版本也高於 ZNNext 的 5.0；</li>
<li>使用者基數與社群經驗少於 NeoZygisk、ReZygisk（Stars 286，對比 2.5k 與 4.1k）；</li>
<li>程式碼量與維護面比上游大（見下文）；</li>
<li>屬性欺騙這類行為改變了系統屬性的回傳值，若你不需要，就多了一份額外的行為。</li>
</ul>
</li>
</ul></section><section><h3>NeoZygisk<a href="#neozygisk"><span>#</span></a></h3><ul>
<li><strong>優勢</strong>：NyaZygisk 的上游，專注做好 Magisk Zygisk API，功能範圍克制，社群經驗多（Stars 2.5k）；DenyList 的 Zygote 直接卸載加 <code>setns</code> 後備就設計在這裡；跟進 Android 17 與 BTI 設備的支援。</li>
<li><strong>限制</strong>：不支援 ZN API，ZN 模組無法使用；無 WebUI；最低 Android 8.0；沒有 <code>TracerPid</code> 清理與屬性欺騙。</li>
</ul></section><section><h3>ReZygisk<a href="#rezygisk"><span>#</span></a></h3><ul>
<li><strong>優勢</strong>：
<ul>
<li>整個程式碼庫用 C 重寫，二進位更小；</li>
<li>自製 linker（CSOLoader），不經系統 linker，對抗基於 linker 的檢測，這個設計方向在五者中獨有；</li>
<li>使用者基數大（Stars 4.1k），WebUI 翻譯與社群管道完整；</li>
<li>最低支援 Android 7.1；</li>
</ul>
</li>
<li><strong>限制</strong>：不支援 ZN API；在 <code>TracerPid</code>、屬性欺騙、maps 偽裝這幾項我沒有找到對應實作；最近一個正式版是 v1.0.0（2026-05-10）。</li>
</ul></section><section><h3>ZNNext<a href="#znnext"><span>#</span></a></h3><ul>
<li><strong>優勢</strong>：ZN API 實作完整，可注入任意由 init 啟動的進程；對核心要求最低，支援 Android 5.0 起與 riscv64；開發最活躍（近三個月 216 次提交，最新版 v2.2.0 在 2026-10-24 釋出）。</li>
<li><strong>限制</strong>：<strong>它不是 Zygisk 實作</strong>，Magisk Zygisk 模組（例如 LSPosed）不會被它載入，必須搭配另一個 Zygisk 實作使用，也就是要裝兩個模組。</li>
</ul><hr /></section></section>
<section><h2>✅ 按需求選<a href="#-按需求選"><span>#</span></a></h2>

<table><thead><tr><th>你的需求</th><th>推薦</th></tr></thead><tbody><tr><td>想要開源，又要同時跑 Zygisk 模組和 ZN 模組</td><td><strong>NyaZygisk</strong></td></tr><tr><td>用 HyperOS，需要 HyperOS Runtime 模組</td><td><strong>NyaZygisk</strong></td></tr><tr><td>只用 Magisk Zygisk 模組（如 LSPosed），但在意屬性與注入痕跡的隱藏</td><td><strong>NyaZygisk</strong></td></tr><tr><td>用 KernelSU LKM 後載入或臨時 root</td><td><strong>NyaZygisk</strong></td></tr><tr><td>只用 Magisk Zygisk 模組，想要最精簡、不需要額外隱藏處理，且重視社群經驗</td><td><strong>NeoZygisk</strong></td></tr><tr><td>只用 Magisk Zygisk 模組，重視對 linker 檢測的對抗，或偏好 C 程式碼庫</td><td><strong>ReZygisk</strong></td></tr><tr><td>ZN 模組要注入 Zygote 以外的系統守護進程</td><td><strong>Zygisk Next</strong>，或 <strong>NeoZygisk + ZNNext</strong></td></tr><tr><td>riscv64 設備，想用開源方案同時跑兩類模組</td><td><strong>NyaZygisk</strong>（v2.5-r1 起）</td></tr><tr><td>Android 5.0 ~ 7.0，需要 ZN 模組</td><td><strong>ZNNext</strong>（Zygisk Next 最低要 8.0；本文比較的 Zygisk 實作最低都要 7.1，Zygisk 模組那一側需另找相容方案）</td></tr></tbody></table><p>幾點補充：</p><ul>
<li><strong>不要同時裝多個 Zygisk 實作</strong>。NyaZygisk、NeoZygisk、ReZygisk、Zygisk Next 彼此是替代關係，Magisk 使用者也要先關閉內建 Zygisk。ZNNext 是唯一設計成與 Zygisk 實作並存的。</li>
<li><strong>Magisk 使用者</strong>：在 NyaZygisk / NeoZygisk 上，請勿開啟 Magisk 的「強制執行排除列表（Enforce DenyList）」，它是 Magisk 自己的機制，可能與實作本身的隱藏機制衝突。</li>
<li><strong>隱藏效果因機型與檢測方案而異</strong>。以上只描述各專案的機制，沒有任何一個能保證通過所有檢測。</li>
</ul><hr /></section>
<section><h2>🎯 NyaZygisk 的定位：精簡，與隱藏<a href="#-nyazygisk-的定位精簡與隱藏"><span>#</span></a></h2><p>最後說明 NyaZygisk 想做什麼，也方便你判斷它是不是你要的。</p><p><strong>精簡</strong>，指的是目標，不是行數。NyaZygisk 把力氣花在注入引擎與模組載入引擎本身，不往模組管理、線上更新、主題之類的方向堆功能；ZN API 這一層也只做模組真正需要的部分（hook、符號解析、companion），而不是複製整個 Zygisk Next。</p><p>需要說清楚的是：這不代表程式碼量最少。以注入器與 daemon 的原始碼行數粗估，NyaZygisk 約 1.4 萬行，NeoZygisk 約 1.1 萬行，ReZygisk 約 1.1 萬行，ZNNext 約 1.3 萬行（不含第三方庫與 WebUI 前端）。相比上游多出來的部分，主要是 ZN 相容層、隱藏處理和 WebUI。如果「精簡」對你來說就是「程式碼最少」，NeoZygisk 更符合。</p><p><strong>隱藏</strong>，是 NyaZygisk 和上游拉開差距的主要方向：</p><ul>
<li>在上游 DenyList（Zygote 直接卸載 + <code>setns</code> 後備）的基礎上，補上 <code>TracerPid</code>、屬性欺騙、匿名記憶體、CFI shadow 處理；</li>
<li>模組全部卸載後把痕跡清乾淨，包括卸載動作自己留下的；</li>
<li>這些額外的隱藏處理都盡量做成可選或可調整的，例如匿名記憶體需要手動開啟、<code>spoof.prop</code> 可以自己編輯，不強迫所有人接受。</li>
</ul><p>所以，如果你的需求是「模組能載入、盡量少露痕跡、不想為了兩套 API 裝兩個模組」，NyaZygisk 就是為這個場景做的；如果你只需要最基本的 Zygisk，或需要 ZN 模組注入任意系統進程，上面的表格已經列出了更合適的選擇。</p><hr /></section>
<section><h2>🔗 相關連結<a href="#-相關連結"><span>#</span></a></h2><ul>
<li><a href="https://github.com/Dr-TSNG/ZygiskNext" target="_blank">Zygisk Next</a>（README 與 API 標頭檔）</li>
<li><a href="https://github.com/HSSkyBoy/NyaZygisk" target="_blank">NyaZygisk</a>（<a href="/nyazygisk/">介紹頁</a>）</li>
<li><a href="https://github.com/JingMatrix/NeoZygisk" target="_blank">NeoZygisk</a></li>
<li><a href="https://github.com/PerformanC/ReZygisk" target="_blank">ReZygisk</a></li>
<li><a href="https://github.com/VeryBaaad/ZNNext" target="_blank">ZNNext</a></li>
<li><a href="https://github.com/5ec1cff/ZygiskNextModuleSample" target="_blank">ZygiskNextModuleSample</a>：ZN 模組範例</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://www.nkbe.top/posts/oplus-kernel-security-check/</id>
      <title type="text">一加內核開源，發現新增「和平精英」專項檢測</title>
      <published>2026-10-03T00:00:00.000Z</published>
      <updated>2026-10-03T00:00:00.000Z</updated>
      <author><name>NkBe</name></author>
      <link rel="alternate" href="https://www.nkbe.top/posts/oplus-kernel-security-check/"/>
      <summary type="text">一加 Ace 6 Ultra 開源內核模組中新增 oplus_kernel_security_check.c，針對系統調用表與 ko 模組加載進行完整性檢測。</summary>
      <content type="html"><![CDATA[<p>在一加開源的 Ace 6 Ultra（聯發科 MT6993）內核模組原始碼中，出現了一個新的檔案 <code>oplus_kernel_security_check.c</code>。</p>
<p>檔案頭部註釋說明，這是為了「和平精英」的需求進行的內核完整性檢測，作者署名為 cenjun，日期標註為 2025 年 12 月。</p>
<p>它的思路並不複雜：<strong>不攔截，只記錄</strong>。<code>ko</code> 檔案照常載入，程序不會被終止，也沒有任何封禁動作，異常只會記錄為事件，等待用戶空間讀取。</p>
<hr />
<section><h2>🔍 檢測了什麼<a href="#-檢測了什麼"><span>#</span></a></h2><section><h3>1. 系統調用表（Syscall Table）<a href="#1-系統調用表syscall-table"><span>#</span></a></h3><ul>
<li>開機時，為整個表記錄一份 SHA256 指紋，之後每小時重新計算一次。</li>
<li>如果與初始值不符，就會記錄一條帶有時間戳記的事件。</li>
<li><strong>限制</strong>：只比較表中的函數指標，不檢查函數本體，因此 inline hook 是無法檢測到的。</li>
</ul></section><section><h3>2. ko 模組載入（Kernel Module Loading）<a href="#2-ko-模組載入kernel-module-loading"><span>#</span></a></h3><p>掛載在內核的 <code>load_module</code> 上，每次載入一個 <code>ko</code> 檔案，就會對其映像計算雜湊值，然後與名單進行比較：</p><ul>
<li><strong>不在名單中</strong>：記錄為未知模組</li>
<li><strong>雜湊值不匹配</strong>：記錄為被篡改</li>
<li><strong>雜湊值一致</strong>：放行</li>
</ul><p>名單由系統程序 <code>oplus_kohashpro</code> 寫入，並且必須等待系統報告開機完成後，檢測才會啟動。每類事件最多保留 10 條，超出部分會丟棄最舊的。</p><hr /></section></section>
<section><h2>⬆️ 對 root 用戶意味著什麼<a href="#️-對-root-用戶意味著什麼"><span>#</span></a></h2><p>判定方式只有一條：<strong>是否在名單上</strong>。即使是自己編譯、完全無害的 <code>ko</code> 檔案，在它看來也與被篡改的 <code>ko</code> 檔案沒有區別。</p><ul>
<li><strong>KSU 的模組</strong>：不經過 <code>load_module</code>，不在檢測範圍內。</li>
<li><strong>KernelSU 本體</strong>：如果以 LKM 方式載入，它自己的 <code>ko</code> 檔案會被記錄為未知模組（此項依程式碼邏輯推斷，尚未經實際設備驗證）。這也代表從理論上使用 GKI 或 Magisk 就能規避該項檢測。</li>
</ul><blockquote><p>不少 root 玩家表示，他們同樣反感作弊行為，也理解遊戲方維護公平環境的需要，只希望這類訊號僅作為參考，不要直接等同於作弊證據。</p></blockquote><hr /><div><div><div></div><div>Note</div></div><div><p>以上內容均基於對公開原始碼的解讀。</p><p><strong>原始碼來源</strong>：<a href="https://github.com/OnePlusOSS/android_kernel_modules_and_devicetree_oneplus_mt6993/blob/oneplus/mt6993_b_16.0_ace_6_ultra/vendor/oplus/kernel/secureguard/gki2.0/rootguard_new/oplus_kernel_security_check.c" target="_blank">OnePlusOSS / android_kernel_modules_and_devicetree_oneplus_mt6993</a></p></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://www.nkbe.top/posts/mc-26-1/</id>
      <title type="text">適配 Minecraft 26.1.x：技術遷移實錄</title>
      <published>2026-04-25T00:00:00.000Z</published>
      <updated>2026-04-25T00:00:00.000Z</updated>
      <author><name>NkBe</name></author>
      <link rel="alternate" href="https://www.nkbe.top/posts/mc-26-1/"/>
      <summary type="text">深度解析 Java 25、Unobfuscated Loom 與 Mojang 官方對映的適配細節，涵蓋工具鏈升級、對映遷移、GUI 重構與 Mixin 修復。</summary>
      <content type="html"><![CDATA[<blockquote><p>深度解析 Java 25、Unobfuscated Loom 與 Mojang 官方對映的適配細節</p><p>由 Gemini 3.1 Pro 自我的 md 原稿重寫為 html，換行好像都是問題///</p></blockquote>
<section><h2>序言<a href="#序言"><span>#</span></a></h2><p>隨著 <strong>Minecraft 26.1.x</strong> 的釋出，Fabric 模組開發生態迎來了一次真正意義上的<em>分水嶺</em>。</p><p>這不只是一次例行的版本升級——而是 <strong>26.1 Fabric</strong> 所代表的<strong>工具鏈、對映體系與開發流程</strong>的整體轉向。</p><p>不僅 Java 版本躍升至 <strong>25</strong>，構建工具 <strong>Loom</strong> 的核心架構、對映機制與 GUI 系統都發生了根本性的重構。</p><p>本文將以 <code>BoatFly</code> 與 <code>PetPhraseX</code> 的完整適配過程為例，簡單說下有關本次遷移的<strong>技術細節</strong>與<strong>踩坑經驗</strong>。</p></section>
<section><h2>第一部分：工具鏈與環境配置<a href="#第一部分工具鏈與環境配置"><span>#</span></a></h2><section><h3>1.1 Java 版本升級至<a href="#11-java-版本升級至"><span>#</span></a></h3><p>Minecraft 26.1.x 要求最低 <strong>Java 25</strong> 作為編譯與執行環境，這不只是版本號上的遞進，更涉及 JVM 的多項新特性與效能最佳化。</p><p>在 <code>gradle.properties</code> 中，我們需要明確指定目標版本，如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>org.gradle.jvmargs</span><span><span> </span><span>=</span><span> -Xmx4096m -</span></span><span>Dfile.encoding</span><span><span>=</span><span>UTF-8</span></span></div></div><div><div><div>2</div></div><div><span>target_java_version</span><span><span> </span><span>=</span><span> 25</span></span></div></div><div><div><div>3</div></div><div><span>minecraft_version</span><span><span> </span><span>=</span><span> 26.1.2</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>Warning</div></div><div><p>**注意：**若使用 Gradle Wrapper 需升級至 <strong>9.4.0+</strong>。</p></div></div></section><section><h3>1.2 Fabric Loader 與 Loom 的版本對齊<a href="#12-fabric-loader-與-loom-的版本對齊"><span>#</span></a></h3><p><strong>Loom 1.15-SNAPSHOT</strong> 是適配 26.1.x 的關鍵版本。它引入了全新的編譯流程，<em>不再依賴 Yarn 對映</em>的中間層轉換。</p><p>同時也建議將 <strong>Fabric Loader</strong>升級至 <strong>0.18.6+</strong>，以支援新的模組載入機制。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>plugins {</span></div></div><div><div><div>2</div></div><div><span>    </span><span>// 引入支援 Unobfuscated 流程的最新版 Loom 外掛</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>id </span><span>'net.fabricmc.fabric-loom'</span><span> version </span><span>'1.16-SNAPSHOT'</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div><span>dependencies {</span></div></div><div><div><div>6</div></div><div><span>    </span><span>// 指定目標 Minecraft 版本為 26.1.2</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>minecraft </span><span>"com.mojang:minecraft:26.1.2"</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span>// 引入支援新模組載入機制的 Fabric Loader 0.18.6+</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>compileOnly </span><span>"net.fabricmc:fabric-loader:0.18.6"</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.3 fabric.mod.json 後設資料規範更新<a href="#13-fabricmodjson-後設資料規範更新"><span>#</span></a></h3><p>伴隨 Fabric Loader 0.18.6+ 的升級，模組後設資料檔案的校驗規則迎來了強約束更新，過往寬鬆的欄位宣告將直接導致模組無法載入，甚至出現啟動器校驗不透過的問題。</p><p>核心變更集中在依賴宣告、環境限定與 Java 版本約束三個維度，尤其針對 Minecraft 26.1.x 與 Java 25 的強制要求，必須在後設資料中明確宣告。</p><div><div><div></div><div>Warning</div></div><div><p>必須在 <code>depends</code> 中明確宣告 <code>"java": "&gt;=25"</code>，否則 Loader 可能會直接阻斷模組載入，無任何容錯空間。</p></div></div></section><section><h3>1.4 IDE 開發環境適配最佳化<a href="#14-ide-開發環境適配最佳化"><span>#</span></a></h3><p>針對 Java 25 與全新 Loom 工具鏈，主流 IDE 也需要完成對應的配置最佳化，才能避免同步失敗、原始碼對映錯亂、除錯斷點失效等問題。</p><p>以 IntelliJ IDEA 為例，核心適配步驟如下：</p><ul>
<li>升級 IDEA 至 2025.3+ 版本，才能獲得 Java 25 語法的完整支援與 Gradle 9.4+ 的原生相容</li>
<li>在 <code>專案結構 → SDK</code> 中新增 Java 25 正式版 SDK，並將專案的 SDK、語言級別均設定為 Java 25</li>
<li>在 Gradle 設定中，將「使用 Gradle 來自」設定為 <code>gradle-wrapper.properties</code>，並指定 Gradle JVM 為 Java 25</li>
</ul></section></section>
<section><h2>第二部分：對映機制遷移<a href="#第二部分對映機制遷移"><span>#</span></a></h2><section><h3>2.1 從 Yarn 到 Mojang 的範式變革<a href="#21-從-yarn-到-mojang-的範式變革"><span>#</span></a></h3><p>本次 26.1.x 適配最核心的變革，莫過於 Loom 1.15+ 帶來的 <strong>Unobfuscated 原生官方對映開發流程</strong>。</p><p>過往 Fabric 模組開發的標準流程，是基於社群維護的 Yarn 命名對映編寫程式碼，編譯時通過 Loom 轉換為 Intermediary 中間對映，最終在執行時匹配遊戲的混淆位元組碼。</p><p>而全新的 Unobfuscated 流程，直接基於 Mojang 官方釋出的 deobfuscation 對映進行開發，徹底移除了 Yarn 中間層的依賴：</p><ul>
<li>編譯流程大幅簡化，無需執行對映轉換，構建速度將會有所提升</li>
<li>命名與官方原始碼完全對齊，避免了 Yarn 與官方對映的命名差異帶來的理解成本</li>
<li>與 Forge 生態的命名體系完全一致，跨載入器模組開發的適配成本大幅降低</li>
</ul><p>在 <code>build.gradle</code> 中，無需再引入任何 Yarn 對映依賴，僅需保留 Minecraft 官方依賴即可完成對映配置，這也是本次工具鏈升級最具顛覆性的變化。</p></section><section><h3>2.2 大規模包名與類名變更<a href="#22-大規模包名與類名變更"><span>#</span></a></h3><p>官方對映的引入，導致了<strong>數百個類</strong>的重新命名。以下是在我專案中常出現的變更對照：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 文本</span></div></div><div><div><div>2</div></div><div><span>net.minecraft.text.Text → net.minecraft.network.chat.Component</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>// GUI</span></div></div><div><div><div>5</div></div><div><span>net.minecraft.client.gui.screen.Screen → net.minecraft.client.gui.screens.Screen</span></div></div><div><div><div>6</div></div><div><span>net.minecraft.client.gui.widget.ButtonWidget → net.minecraft.client.gui.components.Button</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>// 渲染</span></div></div><div><div><div>9</div></div><div><span>net.minecraft.client.gui.DrawContext → net.minecraft.client.gui.GuiGraphics</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div></div><div>Warning</div></div><div><p>**注意：**除了命名變更，大量方法的引數順序、返回值型別也發生了調整，切勿僅做簡單的查詢替換，需逐行核對方法簽名的完整性，避免出現執行時崩潰。</p></div></div></section></section>
<section><h2>第三部分：GUI 系統重構<a href="#第三部分gui-系統重構"><span>#</span></a></h2><section><h3>3.1 渲染生命週期的變更<a href="#31-渲染生命週期的變更"><span>#</span></a></h3><p>在我的專案中，最重大的 API 變更發生在 <code>Screen</code> 類。</p><p>舊版本使用 <code>render()</code>，新版本則改為 <code>extractRenderState()</code>——必須重新適應新的<em>圖形提取模式</em>。</p><div><div><div></div><div>Note</div></div><div><p><strong>提示：</strong><code>GuiGraphicsExtractor</code> 的 <code>text()</code> 預設為<strong>左對齊</strong>，不再內建居中功能，反正開發文件裡我沒看到。</p></div></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>@</span><span>Override</span></div></div><div><div><div>2</div></div><div><span>public</span><span> </span><span>void</span><span> </span><span>extractRenderState</span><span>(</span><span>GuiGraphicsExtractor</span><span><span> graphics</span><span>,</span><span> </span></span><span>int</span><span><span> mouseX</span><span>,</span><span> </span></span><span>int</span><span><span> mouseY</span><span>,</span><span> </span></span><span>float</span><span> delta) {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>super</span><span>.</span><span>extractRenderState</span><span>(graphics, mouseX, mouseY, delta);</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>// 手動計算居中位置</span></div></div><div><div><div>6</div></div><div><span>    </span><span>int</span><span> titleWidth </span><span><span>=</span><span> </span></span><span>this</span><span>.</span><span>font</span><span>.</span><span>width</span><span>(</span><span>this</span><span>.</span><span>title</span><span>);</span></div></div><div><div><div>7</div></div><div><span>    </span><span>int</span><span> centerX </span><span><span>=</span><span> (</span></span><span>this</span><span>.</span><span>width</span><span><span> </span><span>-</span><span> titleWidth) </span><span>/</span><span> </span></span><span>2</span><span>;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>graphics</span><span>.</span><span>text</span><span>(</span><span>this</span><span>.</span><span>font</span><span>, </span><span>this</span><span>.</span><span>title</span><span>, centerX, </span><span>10</span><span>, </span><span>0xFFFFFF</span><span>, </span><span>true</span><span>);</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>第四部分：Mixin 注入體系適配要點<a href="#第四部分mixin-注入體系適配要點"><span>#</span></a></h2><p>本次 26.1.x 版本升級中，Mixin 注入邏輯的調整，是多數模組啟動崩潰的核心誘因。</p><p>除了前文提到的類名、方法名全量變更，遊戲核心類的執行流程、位元組碼結構也有深層重構，過往的注入點會出現無效異常，甚至直接阻斷遊戲啟動。</p><p>以下為本次適配的核心規則，均來自 BoatFly 與 PetPhraseX 的實戰驗證。</p><section><h3>4.1 注入目標的全量重定位<a href="#41-注入目標的全量重定位"><span>#</span></a></h3><p>官方對映體系下，Mixin 注入的核心目標，必須完全替換為 Mojang 官方的命名規範，而非簡單替換 Yarn 對映的名稱。</p><p>核心調整包含三個維度：</p><p>其一，<code>@Mixin</code> 註解的目標類，需替換為官方對映的全限定類名，不可繼續沿用 Yarn 體系的類路徑。</p><p>其二，<code>@At</code> 註解中的注入目標，無論是方法呼叫還是欄位訪問，都需同步更新為官方對映的命名與描述符。</p><p>其三，<code>@Shadow</code> 註解的欄位與方法，必須與官方對映的簽名完全一致，否則會同時出現編譯與執行期雙重異常。</p></section><section><h3>4.2 注入規範的強約束更新<a href="#42-注入規範的強約束更新"><span>#</span></a></h3><p>伴隨 Loom 1.15+ 的升級，Mixin 新增了編譯期強校驗機制，過往寬鬆的注入寫法將直接導致構建失敗。</p><p>最核心的變更，是要求所有注入點必須顯式宣告 <code>require</code> 屬性，推薦強制每個注入點必須匹配到對應目標以防止靜默崩潰。</p><p>同時，介面注入、訪問器的目標類與方法，也需同步完成官方對映的替換，並嚴格按客戶端、服務端環境拆分配置，避免服務端載入客戶端專屬 Mixin 導致的崩潰。</p></section><section><h3>4.3 配置檔案的規範調整<a href="#43-配置檔案的規範調整"><span>#</span></a></h3><p>Mixin 配置檔案需同步完成兩項核心調整，否則會直接導致 Mixin 無法載入。</p><p>第一，必須顯式宣告 <code>compatibilityLevel</code> 為 <code>JAVA_25</code>，確保 Mixin 適配 Java 25 的位元組碼版本。</p><p>第二，必須顯式宣告 <code>required</code> 為 <code>true</code>，明確告知 Loader 該配置為模組必需，避免載入時的警告與潛在異常。</p></section></section>
<section><h2>第五部分：Fabric API 核心體系變更<a href="#第五部分fabric-api-核心體系變更"><span>#</span></a></h2><p>Fabric API 針對 26.1.x 同步完成了架構重構，大量常用事件、工具類被標記為棄用甚至移除，事件的觸發時機、引數列表也有破壞性變更。</p><section><h3>5.1 客戶端生命週期事件重構<a href="#51-客戶端生命週期事件重構"><span>#</span></a></h3><p>伴隨 GUI 渲染系統的重寫，客戶端核心生命週期事件也同步完成了調整。</p><p>螢幕渲染相關事件，完全對應新的 <code>extractRenderState</code> 生命週期，替換了舊版本的 <code>render</code> 相關事件，觸發時機與傳入引數均有對應調整。</p><p>客戶端 Tick、螢幕開啟關閉等核心事件，也進行了名稱空間與分類的重構，需按新的事件路徑完成註冊，否則會出現事件不生效的問題。</p></section><section><h3>5.2 聊天與文本系統適配<a href="#52-聊天與文本系統適配"><span>#</span></a></h3><p>除了前文提到的 <code>Text</code> 到 <code>Component</code> 的類名變更，聊天訊息的事件監聽、文本元件構建 API 也有全量調整。</p><p>文本元件的構建方法，需替換為官方對映對應的靜態方法，樣式設定的流式 API 也有對應調整。</p><p>聊天訊息相關事件進行了強約束重構，新增了訊息取消機制，攔截或修改聊天訊息需按新的規範返回對應結果，否則會出現訊息重複傳送、攔截失效的問題。</p></section><section><h3>5.3 輸入與按鍵繫結系統調整<a href="#53-輸入與按鍵繫結系統調整"><span>#</span></a></h3><p>客戶端輸入處理的重構，也帶來了按鍵繫結、滑鼠鍵盤事件的對應變更。</p><p>按鍵繫結需使用新的註冊 API，而非舊版本的直接例項化註冊。</p><p>按鍵按下/釋放、滑鼠點選滾動等輸入事件，也進行了名稱空間重構，引數列表新增了視窗上下文資訊，需同步完成適配。</p></section></section>
<section><h2>第六部分：常見踩坑與解決方案<a href="#第六部分常見踩坑與解決方案"><span>#</span></a></h2><p>在 BoatFly 與 PetPhraseX 的完整適配過程中，我們整理了多數開發者都會遇到的共性問題，對應的解決方案可大幅縮短適配週期。</p><section><h3>6.1 編譯與環境類問題<a href="#61-編譯與環境類問題"><span>#</span></a></h3><p>最常見的「無效的目標發行版: 25」報錯，核心原因無非三點：Gradle 版本過低、IDE 配置的 Java SDK 版本不正確、目標版本宣告錯誤。</p><p>對應解決方案也很明確：升級 Gradle Wrapper 至 9.4.0+ 版本，在 IDE 中配置 Java 25 正式版 SDK，並將專案與 Gradle 的 JVM 均設定為 Java 25，同時確認配置檔案中的目標版本號正確。</p><p>另一類常見的依賴同步失敗問題，多是 Loom 版本與 Minecraft 版本不匹配，需使用 1.15-SNAPSHOT 及以上的 Loom 版本，才能完整支援 26.1.x 的官方對映流程。</p></section><section><h3>6.2 執行與載入類問題<a href="#62-執行與載入類問題"><span>#</span></a></h3><p>模組載入時提示「依賴約束不滿足」，核心是 <code>fabric.mod.json</code> 中的依賴宣告不符合新規範。</p><p>必須在依賴中顯式宣告 Java 25、對應的 Fabric Loader 與 Minecraft 版本範圍，否則 Loader 會直接阻斷模組載入，無任何容錯空間。</p><p>遊戲啟動時的「模組訪問許可權異常」，是 Java 25 強化了模組系統的訪問控制，需在執行引數中新增對應的模組開放配置，解決反射訪問的許可權問題。</p></section><section><h3>6.3 功能與渲染類問題<a href="#63-功能與渲染類問題"><span>#</span></a></h3><p>GUI 渲染時文本錯位、元件不顯示，多是未遷移至新的渲染生命週期，仍沿用舊的 <code>render</code> 方法，或是文本座標計算不符合新 API 的預設規則。</p><p>需將所有螢幕渲染邏輯遷移至 <code>extractRenderState</code> 方法，手動計算文本與元件的座標，不再依賴舊版本的內建居中功能。</p><p>Mixin 注入失效、功能不生效，需先開啟 Mixin 除錯模式，檢視詳細的注入日誌，核對注入目標的命名、描述符是否與官方對映完全一致，多數問題都來自命名的細微偏差。</p></section></section>
<section><h2>總結<a href="#總結"><span>#</span></a></h2><p>Minecraft 26.1.x 的適配雖然涉及<strong>深度的技術重構</strong>，但也為模組開發生態帶來了長期的<em>穩定性</em>與<em>可維護性</em>。</p><p>透過採用<strong>官方對映</strong>、<strong>新的 GUI API</strong> 與<strong>改進的構建流程</strong>，我們現在能編寫更清晰、更易維護的程式碼。</p></section>]]></content>
    </entry>
</feed>
