百科问答小站 logo
百科问答小站 font logo



为什么有些minecraft的mod作者提供了混淆代码后又提供一份源代码?那提供混淆代码的意义在哪? 第1页

  

user avatar   zhao-yan-bing-97 网友的相关建议: 
      

简单来说,就是题主看到的混淆代码(universal)是供玩家使用的,而非混淆的代码(deobf和sources)是供开发者使用的。

详细说来,我们要从Minecraft这一游戏本身说起。

首先,Mojang并不为其开发的Minecraft游戏提供源代码,同时,其提供的游戏文件也是混淆过的,其中的类没有包名,类名方法名等也全都是abcdef这种无意义的字母组合。

不过,针对Minecraft的修改行为(也就是我们通常所说的Mod和插件)从Minecraft发布不久就有人着手去做了,后来Mojang在Minecraft的最终用户许可协议(EULA)中明确表示了对Mod的支持,包括默许反编译等行为。当然,Minecraft的Mod数量也非常之多,目前至少有上万个Minecraft Mod活跃在各个论坛社区中。

在Minecraft发布不久就出现了专门反编译和反混淆Minecraft代码的组织,这一组织就是MCP(Mod Coder Pack),MCP提供的若干个映射表,就把上面提到的一些无意义的字母组合(又称Notch Name),变成了有意义的方法名类名(又称MCP Name)等。这个映射表就应该是这个样子的:


不过这样就出现了一个问题:毕竟这些名称是从无到有猜测出来的,总有一些名称当时猜不出来,而另一些名称可能当时的猜测是错误的,所以其实这个映射表,是经常修改和补充的。但是,旧的Mod使用的是修改前的名称,而新制作的Mod使用的是修改后的名称,这样怎么能够放在一起运行呢?机智的人民群众很快就想到了一个办法:我们可以使用一套固定的名称索引起来,打包Mod和运行Mod的时候都使用这套名称不就可以了?所以映射表就变成了这样:


半混淆名有着形如func_xxxxxx_x或者field_xxxxxx_x的形式,一般情况下不会发生变动。半混淆名又名SRG Name,以纪念MCP的领导者,后来进入Mojang参与Minecraft开发的Searge。

Minecraft Forge,一套主流的Minecraft Mod API,在运行的时候使用的正是这套方式:编译并打包Mod的时候把其中的未混淆名变成半混淆名,运行Minecraft的时候把混淆名同样变成半混淆名,这样Mod就可以使用半混淆名正常工作了。

所以正如题主所见,在直接下载Mod文件并运行的时候,其中的代码已经使用的是半混淆名了。然而在开发Mod的时候,如果Mod开发者想要提供其他Mod的兼容支持,那么就需要链接其他Mod的类,此时因为开发环境使用的是未混淆名,所以引入的其他Mod也必须使用未混淆名,也就是题主所看到的deobf(提供编译后的后缀名为.class的文件)和source(直接提供后缀名为.java的源代码)两个JAR。




  

相关话题

  既然Java反射可以访问和修改私有成员变量,那封装成private还有意义么? 
  Java 岗位面试,面试官最后说,你还有什么要问的吗? 
  PS3可以双人同屏玩我的世界1.21吗? 
  MC 我的世界中最美的风景是怎样的? 
  为什么 Garry's Mod 没有办法像 Minecraft 那样出色? 
  如何看待游戏《我的世界》(Minecraft)1.17.1 pre2 版本加入了文言文? 
  Minecraft(我的世界)有哪些好的联机服务器推荐? 
  这篇博文c#比JAVA慢这么多 为什么? 
  在《我的世界》中一直沿着海岸线走,能否走回原地? 
  C++ 的什么是 Java 不能取代的? 

前一个讨论
龟背竹的气生根有什么作用?
下一个讨论
生物体型大小受大气含氧量影响,那么大气含氧量又是由什么决定的呢?





© 2024-12-18 - tinynew.org. All Rights Reserved.
© 2024-12-18 - tinynew.org. 保留所有权利