Java 编译前使文件模糊的程序?

Java 编译前使文件模糊的程序?,java,obfuscation,Java,Obfuscation,我正在与ForgeGradle Minecraft Forge modding平台合作 我想在发布之前混淆我的mod,但Forge平台的本质不允许我在编译完定义的库后简单地运行ProGuard之类的程序 为什么?? 结构如下: Mod->Forge->Minecraft 由于Minecraft使用自己的模糊类,并且ForgeGradle编译器不会直接模糊Mod的代码以适应Minecraft的代码,因此在使用ProGuard时,不可能使用MC.jar作为库。编译的Forge Mod实际上是由For

我正在与ForgeGradle Minecraft Forge modding平台合作

我想在发布之前混淆我的mod,但Forge平台的本质不允许我在编译完定义的库后简单地运行ProGuard之类的程序

为什么?? 结构如下: Mod->Forge->Minecraft

由于Minecraft使用自己的模糊类,并且ForgeGradle编译器不会直接模糊Mod的代码以适应Minecraft的代码,因此在使用ProGuard时,不可能使用MC.jar作为库。编译的Forge Mod实际上是由Forge在运行时使用SRG名称解码的。这背后的逻辑不容易解释,所以我只需要注意:我不能以适合库的方式混淆.jar

所以我想——我可以在Forge编译之前,使用mod的code.java文件重命名所有属于我的字段/方法/类。 是否有一个软件可以让我挑选大量的.java文件,并以一种不重新命名不属于它们的引用的方式对它们进行模糊处理

编辑更多说明:

Mod的代码有三种状态:开发、编译、运行

我将尝试举一个例子: 假设在Minecraft.jar中有一个反编译方法itemswird.onHit 其编译的模糊版本如下所示:bca.aa,并且所有包都丢失

在mod的code.java开发状态中,为了引用它,我们只需创建:itemswird.onHit

当我们编译mod时,调用将如下所示。class:itemswird.func_ab4234-这就是我所说的SRG

现在当mod加载到游戏中时,forge将把ItemSwarm转换为bca,func_ab4234转换为aa

由于这个原因,我甚至不能添加适当的库-没有。我总是会收到ProGuard NoClassDefFound警告,我不能忽视它,它会导致编译崩溃


因此,在这次编辑之后-考虑到我无法分配好的库,仍然可以使用ProGuard进行模糊处理吗?

您是否尝试过ProGuard选项?

e、 g.对于可序列化类和其他内容,将其放入proguard配置中,如果愿意,您还可以保留完整的类:


如果我有你的问题,你想混淆你自己的代码,而不是其他任何东西。这就是ProGuard真正擅长的。假设您在com.foo和com.bar包中创建了类。您可以使用这个简单的ProGuard命令来混淆您自己的类:

-keep class !com.foo.**,!com.bar.** { *; }
它告诉ProGuard不要混淆不属于com.foo或com.bar的类的任何成员


如果出现NoClassDef错误,则添加了错误的库。我猜您正在使用某种IDE,可能是eclipse。查看项目引用的库,以找到正确的库类路径,例如jar文件。您基本上需要找到用于编译代码的类路径,ProGuard也会这样做,一切都应该正常。

当然,您可以在编译之前混淆源文件。您可以消除基于类、方法、字段或变量名的所有有用信息。但是,有些东西只能在编译的.class文件中的字节码中进行处理。此外,确保编译时不包含任何调试信息。是的,但问题是如何快速完成,而且可能是随机的?我正在使用Eclipse,我知道折射器工具,这正是我所需要的,但它只需要在所有选定的文件上点击几下就可以自动完成。有人知道这样的事情是否存在吗?我已经做了修改。你能确认你上面的建议仍然可行吗?如果是这样的话,我将学习更多关于keep选项的知识。有一件事需要澄清:如果你不混淆你的mod,它是有效的,对吗?这就是问题所在,没有库可以处理编译后的mod。再次阅读我的编辑。只有用于mod开发状态和运行mod的库完全混淆了。没有用于刚编译的mod的库。编译后的mod由ForgeModLoader加载,并在启动时在运行时重新编译,因此没有.jar。所有这些都是由Transformers:D使用保存在.srg-like.txt文件中的名称完成的。我无法获得正确的库。真的没有基于eclipse折射器的模糊器吗?@Ernio forge框架在编译后会修改类文件吗?是的,当创建一个mod时,你是在完全未使用的工作区中工作的,然后当你编译时-你的mod被编译成forge通用名,无论你使用什么版本,每次Minecraft更新方法名称更改时,mod将始终保持不变,Forge不会。然后,当你把你的mod放到用户端环境中时,Forge会加载mod并根据版本将其翻译成Minecraft可读的类,翻译是不同的。转换发生在类加载阶段,由ASM完成。正因为如此,我没有天秤座
这就是为什么我希望在编译mod-in.java文件之前,真正地完成所有的私有模糊处理。我不敢相信没有像eclipse一样的用于eclipse的Fractor模糊处理程序或插件。我已经找了好几个小时了。如果有人知道什么,请将我链接到它,我会很高兴的。@Ernio刚刚在我的待办事项列表中添加了一些内容!对不起,我也不知道
-keep class !com.foo.**,!com.bar.** { *; }