百科问答小站 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 只有值传递,但 C# 既有值传递,又有引用传递,这种语言设计有哪些好处? 
  如何通俗易懂解释 Java 语言所谓「一次编写,到处运行」的特性? 
  怎么在MC中做一个好看的内饰? 
  自学java,学多久可以自己找到工作? 
  java学成什么样子可以出去实习? 
  为什么微软不是山寨一个 Minecraft 而是将其收购? 
  如何评价网友因为儿子总是不听话不能按时起床,删掉了儿子玩了一年的《我的世界》? 
  有谁是单纯地喜欢编程吗? 
  在Minecraft 里你们认为哪个怪物最强呢? 
  《我的世界》为什么不叫《矿工工艺》? 

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





© 2024-05-20 - tinynew.org. All Rights Reserved.
© 2024-05-20 - tinynew.org. 保留所有权利