Java 有没有办法使用gradle来混淆minecraft 1.8.9的代码?
我正在编写一个minecraft mod,当我在forge 1.8.9中运行它时,我得到了noSuchMethodError:net.minecraft.client.getMinecraft.FontRenderObj。然而,当我运行另一个mod时,这个mod可以工作 我的mod的反编译类文件如下所示Java 有没有办法使用gradle来混淆minecraft 1.8.9的代码?,java,gradle,minecraft,minecraft-forge,Java,Gradle,Minecraft,Minecraft Forge,我正在编写一个minecraft mod,当我在forge 1.8.9中运行它时,我得到了noSuchMethodError:net.minecraft.client.getMinecraft.FontRenderObj。然而,当我运行另一个mod时,这个mod可以工作 我的mod的反编译类文件如下所示 this.renderer = Minecraft.getMinecraft().fontRendererObj; this.renderer = Minecraft.func_71410_x
this.renderer = Minecraft.getMinecraft().fontRendererObj;
this.renderer = Minecraft.func_71410_x().field_71466_p;
而另一个看起来像
this.renderer = Minecraft.getMinecraft().fontRendererObj;
this.renderer = Minecraft.func_71410_x().field_71466_p;
无论我如何构建我的mod,我的类文件永远不会像这样结束。如何使gradle混淆代码?一个选项是使用gradle加载ProGuard并使用它混淆JAR 然后,您需要这样的依赖项:
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:6.1.1'
}
}
您还需要定义一个任务,类似于:
task useProGuard (type: proguard.gradle.ProGuardTask) {
configuration 'proguardcfg.pro'
injars jar.archivePath
outjars "${myDir}/MyJar.jar"
}
如任务中所示,创建一个proguard配置文件,在其中定义proguard应该做什么以及应该处理哪些类的规则
此文件中的条目可以如下所示:
#-dontobfuscate
-dontshrink
-dontoptimize
-keep class com.jni.** { *; }
...
如果注释掉的参数是一个防止混淆的命令,接下来的两个命令告诉ProGuard不要收缩JAR或使用它们自己的优化,最后一个条目是一个名为com.jni的包中的类规则,因为更改本机函数的函数签名是危险的
阅读有关ProGuard的更多信息:
此外,我相信标准Android构建管道在默认情况下也使用ProGuard。您运行的是什么Gradle命令?我首先运行setupDecompWorkspace命令,然后运行build命令来获取jar。您确定使用的是正确的jar吗/gradlew build应该已经生成了一个可以使用模糊名称的jar。OP不想模糊自己的方法。他希望它被重写以与Minecraft模糊的方法名兼容,因此它在开发环境之外工作。他希望它被重写-这有什么关系?他的mod jar引用了Minecraft自己代码中存在的一系列字段和方法。一个是FontRenderObj。但只有下载了mod开发环境的人才能获得具有该域名的Minecraft版本。而普通玩家则有一个模糊版本的Minecraft,该区域称为field_71466_p。他在问如何让他的mod的jar文件使用模糊的字段名,这样就可以为普通玩家使用了。通常,./gradlew build只是用Minecraft mods为你做这件事,所以这里的问题是为什么它不适合他。我明白了。我的解决方案只是为了模糊他们的JAR,并定义一个类似于所使用的方案。但是它不会做任何映射,当然,如果需要,那么minecraft功能需要与mod一起混淆,否则映射是不可能的。这就是每个锻造模组的工作原理。