Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法使用gradle来混淆minecraft 1.8.9的代码?_Java_Gradle_Minecraft_Minecraft Forge - Fatal编程技术网

Java 有没有办法使用gradle来混淆minecraft 1.8.9的代码?

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

我正在编写一个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().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一起混淆,否则映射是不可能的。这就是每个锻造模组的工作原理。