我正在使用ForgeGradle(Minecraft Forge改装平台)。
我想在发布之前混淆我的mod,但Forge平台的本质不允许我通过在编译后运行像ProGuard这样的程序(使用已定义的库)来实现它。
为什么呢? 结构如下: Mod - >锻造 - >的Minecraft
由于Minecraft使用自己的混淆类并且ForgeGradle编译器没有直接混淆Mod的代码以适应Minecraft的编码,因此在使用ProGuard时不可能将MC.jar用作库。 Compiled Forge Mod实际上是由Forge在运行时使用SRG名称解码的。这背后的逻辑不容易解释,所以我要注意:我不能以适合库的方式混淆.jar。
所以我虽然 - 我可以只使用我的mod的代码(.java文件)并在Forge编译之前重命名所有MINE的字段/方法/类。 是否有一个软件允许我选择.java文件的数量并以一种不重新命名不属于它们的引用的方式“混淆”它们?
编辑(更多解释):
Mod的代码有3种状态:开发,编译,运行。
我会试着举个例子: 假设在Minecraft.jar中有一个反编译方法ItemSword.onHit() 它的编译(混淆)版本看起来像这样:bca.aa(),所有包都丢失了(展平)。
在mod的开发状态代码(.java)中引用它我们只需:ItemSword.onHit()
当我们编译mod时,调用将看起来像这样(.class):ItemSword.func_ab4234() - 这是我正在谈论的SRG。
现在当mod加载到游戏中时,forge会将“ItemSword”翻译为“bca”,将“func_ab4234()”翻译为“aa()”
因此,我甚至无法添加适当的库 - 没有。我将永远得到(在ProGuard中)NoClassDefFound警告,我不能忽略它(它会崩溃编译)。
因此在编辑之后 - 是否仍然可以使用ProGuard进行模糊处理(考虑到我不能分配“好”库)?
答案 0 :(得分:0)
您是否尝试过proguard选项? http://proguard.sourceforge.net/manual/usage.html
e.g。对于Serializable类和其他东西把它放到你的proguard配置中(如果你愿意,你也可以保留完整的类):
<!-- With this code serializable classes will be backward compatible -->
<keepnames implements="java.io.Serializable"/>
<!-- or for native access:-->
<keepclasseswithmembernames>
<method access="native"/>
</keepclasseswithmembernames>
<!--Preserve all public classes, and their public and protected fields and methods.-->
<keep access="public">
<field access="public protected"/>
<method access="public protected"/>
</keep>
答案 1 :(得分:0)
如果我收到你的问题,你想要混淆你自己的代码,而不是那些东西。这就是ProGuard实际上非常擅长的。我们假设您已在包com.foo
和com.bar
中创建了类。您可以使用这个简单的ProGuard命令来模糊您自己的类:
-keep class !com.foo.**,!com.bar.** { *; }
它告诉ProGuard不要混淆不属于com.foo
或com.bar
的任何类成员。
如果您收到NoClassDef
错误,则添加了错误的库。我猜你正在使用某种IDE(也许是eclipse)。查看项目引用的库以查找正确的库类路径(例如jar文件)。你基本上需要找到用于编译代码的类路径,ProGuard也会采用它,一切都应该有效。