帖子

Memorial Edition

查看: 90|回复: 5

[时评] Java版将取消代码混淆,对Mod开发有何影响?

[复制链接]

Lv.9 牧场主

人气
981 点
金粒
1437 粒
宝石
2 颗
爱心
46 颗
钻石
1556 颗
贡献
8 点

Java正版勋章Windows 10正版勋章

小E不等号Internet Explorer

发表于 前天 23:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 teddyxlandlee 于 2025-10-30 23:06 编辑

Java版将取消代码混淆,对Mod开发有何影响?

作者:teddyxlandlee | 本文以CC BY-NC-SA 4.0协议发布


原文:Removing obfuscation in Java Edition

参考视频: [McJava] 突发!去除混淆对我们有什么影响? by @WisW

简单解释一下发生了什么:

  1. 从下个快照起,Mojang在发布常规版本快照的同时,将同步发布未混淆版本的Minecraft JAR,作为“实验性版本”(experimental release)
  2. 群骑纷争(1.21.11或1.22)正式版的下一个快照的JAR将不再混淆

虽然这并不意味着将Minecraft开源,但这意味着:

  1. 模组开发和模组加载器安装时,将不再需要反混淆
  2. 模组编译时,将不再需要重混淆。

前情提要:Mod社区的反混淆史

自2019年起,Mojang在发布版本的同时会附带混淆映射表(Obfuscation Map),即模组社区俗称的MojMaps。在此之前,模组社区已经出现了MCP、Fabric Yarn等反混淆方案。受版权因素和社区惯性等影响,MojMaps并未受到广泛使用,社区的反混淆表和MojMaps处于并存的状态。

2020年,Mojang更新了MojMaps的许可证,更改了部分用词,被认为对模组开发更友好。

在此之后,Forge于1.17弃用MCP,在开发环境中全面转向MojMaps,在生产环境中使用MojMaps的类名,仍使用类似m_1234_、f_5678_这类名称(中间名)。Forge在1.20.6在生产环境下也全面转向了MojMaps。

NeoForge自其从Forge分家起(1.20.2),就全面使用了MojMaps。当时在NeoForge社区内部就使用MojMaps的法律问题达成了共识,认为法律风险很低。

Fabric的开发工具链虽然支持使用MojMaps,但其团队及贡献者一直在维护Fabric的中间名(intermediary)和反混淆表(Yarn),在Fabric API等官方项目中也一直使用Yarn。

至此,除Fabric仍在使用/维护其自家反混淆表以外,其余主流Mod加载器已完全使用Mojang的官方混淆映射表。此外,相当多的Fabric模组也使用官方混淆映射表。官方混淆映射表正逐渐成为主流

“扶正”官方符号表,Fabric的反混淆体系何去何从

随着Mojang移除混淆,“混淆后的名称”(obfuscated names / obfname)这一概念将不复存在,第三方的反混淆方案将失去其存在的意义。

笔者早上看到这则新闻时以为自己起猛了,带着一个问题去上了早八:Fabric会继续把intermediary和Yarn维护下去吗?

一开始我觉得会:

  1. Yarn是CC0协议的(发布者放弃其本应拥有的版权),且不允许借鉴MCP、MojMaps等具有版权的反混淆符号表;而为了维持Yarn的“纯洁性”(purity),仍需要在MojMaps和Yarn之间设置一道机器生成、无自然语义的中间名(intermediary);
  2. 为最大限度保证旧版本Mod在1.21.11仍能运行,intermediary依然需要存在,但在生产环境下,旧版本Mod会被重映射(remap)至官方符号表。

之后我登录了Fabric的Discord服务器,发现事情并非如此。大部分Fabric开发者并不是抱着“开放协议”不放的原教旨主义者,坚持使用Yarn符号表的开发者主要是因为不喜欢Mojang的符号命名,或习惯于Yarn的符号命名。总而言之,Fabric社区的反应与当年NeoForge社区比较类似,都认为使用官方符号表没啥风险

后来,Fabric的发起者modmuss确认称,intermediary和Yarn都将停更,但工具链不会移除对第三方映射的支持。

The big plan is to leave intermediary and yarn behind, but still provide an option for those that want to use custom mappings. Actually doing that is much easier said than done though.

同时,Fabric API将迁移至官方符号表(此时说“MojMaps”可能不太合适了,因为这个“Map”不复存在了,姑且称为MojNames吧)。大概会分以下几个步骤:

  1. 先处理高优先级的Pull Requests,如需要大改的GameRule API;
  2. 把Fabric API的代码库从Yarn迁移到MojMaps;
  3. 从内部实现到对外接口,逐步将Fabric API本身的命名调整为官方命名(如ScreenHandlerRegistry会被改成MenuRegistry)。

modmuss一开始认为,由于重映射源码的工具Mercury并不支持Mixins,Step 2将需要花费相当大的精力完成对Mixins的修正,即需要“人海战术”。

用户Cassian指出,信雅互联(Sinytra)所依赖的Forgified API的上游项目FAPI-MojMaps,就使用了MercuryMixin(Sinytra的分支版本)将Fabric API的仓库整体映射至官方符号表。笔者尝试使用该工具进行迁移,但由于该项目使用的旧版工具链(Loom)已不再兼容最新版快照的Yarn映射格式,且该项目调用了大量Loom的内部实现,迁移难度很高。

于是笔者借鉴FAPI-MojMaps的实现思路,Fork了一份Loom,将Sinytra的MercuryMixin引入作为依赖,为migrateMappings任务添加了Mixin processor。用Fork后的Loom替换Fabric API使用的Loom进行migrateMappings时,Mixin类的Shadow字段、target字符串等都能被正确地重映射。总之,经过笔者的验证,此方案可行性很强。该方案得到了modmuss的认可。

我是Fabric模组开发者,对我有什么影响

首先,1.21.10之前的Fabric Mod将不会兼容1.21.11,因为生产环境中将使用未混淆的符号表(MojNames),而非中间名(intermediary),后者将不复存在。可以说,把NeoForge上能跑的Mod缝缝补补之后在Fabric上跑起来的概率,甚至会比让1.21.10下的Fabric Mod在1.21.11上跑还要高一些。

官方符号表的命名不兼容只是一方面。由于Fabric API全面转向官方符号表,它的命名风格也会随之更改,这种修改是破坏性的。我们姑且期待一下,Fabric在正式版发布时应该会发表迁移指南

如果你的Mod打算继续跟进Minecraft的更新,强烈建议迁移到MojMaps。Fabric官方将放弃对Yarn的维护,如果坚持使用Yarn,在新版本下开发可能会比较困难。

我是Fabric模组玩家,1.21.10会成为下一个1.7.10吗?

大概率不会。

1.7.10、1.12.2、1.16.5等“Mod黄金版本”的出现,有一个共同的重要原因:难以向上迁移,背后都有Mojang对代码的大改。而由于这些大改,Forge也需要跟着大改,Forge大改之前还需要等MCP命名映射的完善……这导致Mod作者滞留在大改前的版本,逐渐催生该版本Mod生态的繁荣。

1.21.10的情况比较类似:Yarn映射原地爆炸,官方符号表被当场扶正,旧版Fabric模组在新版能跑起来零个(不与Minecraft本体交互的除外)。但1.21.11的难迁移性有个前提:使用Yarn。官方符号表并不是什么新事物,而是许多Mod开发者已经在使用的东西,他们无非就是需要适配一下作出命名更改后的Fabric API而已,迁移难度比1.7.10、1.12.2(Forge磨叽)、1.16.5(Java 8升Java 17导致脏反射当场爆炸、Forge加载器底层大改)这些版本要小很多。Fabric的主要贡献者对Mojang去除混淆的响应是相当积极的,大家不必过于担心。

但这里建议有能力的开发者帮助Fabric API完成这次迁移。更改命名(Step 3)的工作量会比较大。modmuss称,他欢迎贡献者协助完成这次迁移。

官方符号表被扶正,Mojang是否有意推动Mod社区大一统?

We hope that, with this change, we can pave a future for Minecraft: Java Edition where it’s easier to create, update, and debug mods.

可以看出,Mojang的初心就是让Mod的制作、更新和调试更简单。

关于“Mod社区大一统”这件事,Mojang没有给出确切的答案。

但可以肯定的是,随着符号命名的统一,越来越多的跨平台Mod将会涌现,同一个文件既能用Fabric跑,又能用NeoForge跑的情况将会更加常见。

笔者编写的Mod中有不少是跨平台的。相信下一个正式版后,跨平台开发将会变得更加简单。

评分

参与人数 1人气 +1 金粒 +20 收起 理由
氷糖西瓜霜 + 1 + 20 MCBBS有你更精彩~

查看全部评分

Lv.8 考古家

人气
289 点
金粒
546 粒
宝石
3 颗
爱心
23 颗
钻石
864 颗
贡献
0 点
发表于 昨天 14:53 | 显示全部楼层
我承认我没认真看discord, 但是他们试图在不更改Fabric Api代码的情况下直接port到MojNames?

(这么高质量的文章你告诉我参考了那么水的一个视频()

点评

不更改✗ 不重构✓  详情 回复 发表于 昨天 16:01
回复

使用道具 举报

Lv.9 牧场主

人气
981 点
金粒
1437 粒
宝石
2 颗
爱心
46 颗
钻石
1556 颗
贡献
8 点

Java正版勋章Windows 10正版勋章

小E不等号Internet Explorer

 楼主| 发表于 昨天 16:01 来自手机 | 显示全部楼层
本帖最后由 teddyxlandlee 于 2025-10-31 16:02 编辑
WisW 发表于 2025-10-31 14:53
我承认我没认真看discord, 但是他们试图在不更改Fabric Api代码的情况下直接port到MojNames?

(这么高质量 ...


不更改✗ 不重构✓
不仅要改,而且是破坏性修改,API中涉及到的名称会改成mojang风格的名字,这一过程会比较耗精力

点评

"将Fabric API的仓库整体映射至官方符号表"这个操作不会实际进生产环境?  详情 回复 发表于 昨天 16:56
回复

使用道具 举报

Lv.8 考古家

人气
289 点
金粒
546 粒
宝石
3 颗
爱心
23 颗
钻石
864 颗
贡献
0 点
发表于 昨天 16:56 | 显示全部楼层
teddyxlandlee 发表于 2025-10-31 16:01
不更改✗ 不重构✓
不仅要改,而且是破坏性修改,API中涉及到的名称会改成mojang风格的名字,这一过程会 ...

"将Fabric API的仓库整体映射至官方符号表"这个操作不会实际进生产环境?

点评

生产环境将全面使用mojname而非intermediary 因为原版生产环境就将使用mojname而非obfname 而intermediary已经没有继续存在的意义了  详情 回复 发表于 昨天 17:42
回复

使用道具 举报

Lv.9 牧场主

人气
981 点
金粒
1437 粒
宝石
2 颗
爱心
46 颗
钻石
1556 颗
贡献
8 点

Java正版勋章Windows 10正版勋章

小E不等号Internet Explorer

 楼主| 发表于 昨天 17:42 来自手机 | 显示全部楼层
WisW 发表于 2025-10-31 16:56
"将Fabric API的仓库整体映射至官方符号表"这个操作不会实际进生产环境?

生产环境将全面使用mojname而非intermediary
因为原版生产环境就将使用mojname而非obfname
而intermediary已经没有继续存在的意义了

点评

所以还是人海战术  详情 回复 发表于 昨天 18:35
回复

使用道具 举报

Lv.8 考古家

人气
289 点
金粒
546 粒
宝石
3 颗
爱心
23 颗
钻石
864 颗
贡献
0 点
发表于 昨天 18:35 | 显示全部楼层
本帖最后由 WisW 于 2025-10-31 18:39 编辑
teddyxlandlee 发表于 2025-10-31 17:42
生产环境将全面使用mojname而非intermediary
因为原版生产环境就将使用mojname而非obfname
而intermediar ...

所以还是人海战术(划掉

哦我搞错了我以为那个是字节码层面的修改
好吧 我确实不应该去碰fabric (悲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋| MCBBS纪念版 ( 新ICP备2024014954号|兵公网安备66010002000149号 )|隐私政策| 手机版

GMT+8, 2025-11-1 08:16 , Processed in 0.123677 second(s), 34 queries , Redis On.

"Minecraft"以及"我的世界"为美国微软公司的商标 本站与微软公司没有从属关系

© 2010-2025 MCBBS纪念版 版权所有 本站内原创内容版权属于其原创作者,除作者或版规特别声明外未经许可不得转载

返回顶部