如何用一個(gè)已編譯的 Fabric Mod JAR 重建模組項(xiàng)目
各位好,這里是夏夜之風(fēng)。
前段時(shí)間給一個(gè)朋友修復(fù)了一個(gè)不工作的模組,因?yàn)榈谝淮谓佑|這種問(wèn)題,所以把過(guò)程寫下來(lái),算是一筆寶貴的經(jīng)驗(yàn)了。
聲明: 本人不鼓勵(lì)濫用反編譯技術(shù)。請(qǐng)尊重創(chuàng)作者的作品!本文僅提供一個(gè)在原項(xiàng)目丟失時(shí)重建項(xiàng)目的思路,僅供學(xué)習(xí)參考。
如果你要跟著這篇文章重建一個(gè)模組項(xiàng)目,請(qǐng)務(wù)必認(rèn)真閱讀本文,尤其是下文提及的需要注意的點(diǎn)。
(這些坑我可都替各位踩過(guò)了)
首先,就 Fabric 而論,玩家拿到的 Mod ,其代碼中有關(guān) Minecraft 的類引用均為 SRG 名稱 (Searge 半混淆名),
因此,如果要重建模組項(xiàng)目,就必須把模組代碼內(nèi)所有 Minecraft 的類引用重命名為其各自對(duì)應(yīng)的 Tiny 名稱。
因此,重建一個(gè) Fabric 模組項(xiàng)目,你將會(huì)用到如下工具鏈:
Yarn
Tiny Remapper
FernFlower
一個(gè) Java IDE (這個(gè)可選,但是糾正反編譯的錯(cuò)誤結(jié)果時(shí)沒(méi)有一個(gè) IDE 真的會(huì)很痛苦)
過(guò)程則分如下幾步:
1. 拿到 Mod JAR 文件
2. 使用 Yarn 構(gòu)建 Mod 所需 Minecraft 版本的映射表 (去 Fabric 的 Maven 倉(cāng)庫(kù)下載也可以)
3. 使用 Tiny Remapper 將原始 Mod JAR 文件內(nèi)的所有 class 文件進(jìn)行處理,以重命名 Minecraft 類引用
4. 使用 FernFlower 反編譯經(jīng)過(guò) Tiny Remapper 處理的 Mod JAR 文件。
5. 新建一個(gè)全新的 Fabric Mod 項(xiàng)目,Minecraft 版本必須與原 Mod 對(duì)應(yīng)
6. 解包 FernFlower 生成的源代碼 JAR 包,并將有 Java 代碼的文件夾移動(dòng)到前面創(chuàng)建的新 Mod 項(xiàng)目中
7. 人工糾正反編譯結(jié)果,如補(bǔ)上被編譯器抹去的泛型信息 (在類聲明上是必須的,其他地方是可選的),刪去一些不必要的 Synthetic 方法 (如枚舉中可能存在的 $values() 方法,F(xiàn)ernFlower 默認(rèn)會(huì)生成它)
8. 完成,重編譯后的結(jié)果應(yīng)當(dāng)也可以正常運(yùn)行
工具的倉(cāng)庫(kù)鏈接在下方:
Yarn - https://github.com/FabricMC/yarn
Tiny Remapper - https://github.com/FabricMC/tiny-remapper
FernFlower - https://github.com/fesh0r/fernflower
如果這些工具沒(méi)有直接可用的預(yù)編譯成品,可以自行編譯。(我就是自己編譯的)
需要注意的點(diǎn):
你將要使用的混淆表應(yīng)當(dāng)是 merged 表(我使用的是 merged-v2.tiny),
否則相當(dāng)一部分的 Minecraft 類引用將仍然不能被反混淆。
Tiny Remapper 的用法是這樣的:
java -jar tiny-remapper.jar yourmod.jar output.jar mapping.tiny intermediary named
其中,"yourmod.jar" 是指你的原始模組 JAR 。
"output.jar" 是輸出的名稱,這個(gè)隨意。
"mapping.tiny" 是你預(yù)先準(zhǔn)備好的 Merged Tiny 混淆表。
FernFlower 的用法是這樣的:
java -jar fernflower.jar input.jar outputdir/
"input.jar" 是待反編譯的 JAR
outputdir 是輸出文件夾 (這個(gè)必須預(yù)先建好,否則 FernFlower 將報(bào)告找不到文件夾然后拒絕執(zhí)行)
已知問(wèn)題:
被 Mixin 注解的字段與方法不能正確反混淆,需要人工糾正。(也可能是我的 Tiny Remapper 用法有誤?歡迎指正)
本文寫于 2023.8.4,一次修訂于 2023.8.6
本文采用 CC BY-SA 4.0 協(xié)議進(jìn)行許可。