TeaCon 茶后谈第 257 期
每当我们迎来 Minecraft 大版本更新的时候,我们总能在各种地方看到翘首以盼等模组更新的玩家们,但屏幕前的你是否曾思考过一个问题:模组开发者如果想要更新他们的作品,需要满足哪些必要条件?这个「模组开发者也在等」的清单里的内容会因为切入问题的角度的不同而不同,但在这个列表中肯定有一个东西排在前面:「我们需要一个模组开发者能用的开发环境」,或者说「我们需要反混淆 Minecraft,不然我们就得硬啃混淆后的 Minecraft,另外,我们有时候还需要反编译 Minecraft」。反混淆的问题很好解决:把大家破译出来的信息(即所谓的「反混淆名」)收集成一个表就是了。然而,开发者们很快意识到 Minecraft 每次更新后,混淆的对应关系都会有所变化,反混淆名和混淆后的名字需要重新建立对应关系,另外破译出来的结果也可能会在未来被发现并不准确,需要修订。为了应对这些问题,「中间名」的概念应运而生:这边大家把反混淆名跟中间名对应上,那边 Minecraft 更新后再把新的混淆名和中间名对应上。这样一来,两边的进度就都不会被 Minecraft 本身的更新所耽误,模组开发者还可以通过使用这个「中间名」来抵消「反混淆数据变来变去」的影响。至于反编译?表面上我们只需要一个反编译器就够了,但实际上,反编译器并不一定能百分之百复原程序编译前的样貌,为此我们一方面可以通过改进反编译器来提供更好的反编译结果,另一方面我们也可以考虑直接上手,人工修复反编译的结果。在 Minecraft 模组社区的十余年历史中,这个说难不难,说轻松也不轻松的工作,到今天却只有寥寥数个团队在做,比较知名的有直属 Forge 的 MCPConfig(https://github.com/MinecraftForge/MCPConfig)和直属 FabricMC 的 Intermediary(https://github.com/FabricMC/Intermediary)。其中,MCPConfig 提供通称 SRG 的中间名数据和修复反编译结果的补丁(patch);而追求轻量化的 Fabric 工具链则只提供了通称 Intermediary 的中间名数据。此外,在基于 Bukkit 的服务器插件开发中经常可以遇到的「NMS」也可以看作是一种「反混淆」,从这个角度来看,目前维护 https://hub.spigotmc.org/stash/projects/SPIGOT/repos/builddata 的 SpigotMC 也是这「寥寥数个团队」中的其中一员。【本期编辑:3TUSK】