我有一个Fabric 1.17.1 (Java 16) mod for mod,我正在尝试对其进行混淆。包括在这个mod中的是我的事件系统,它处理我的mod的所有事件。此事件系统使用invoke方法在运行时调用我的事件侦听器类中的事件。
下面是我使用call方法调用的事件:
@EventHandler
public static void onMinecraftInitialization(EventMinecraftInitialization event)
{
// Do stuff
}
下面是call方法:
public void call(Event event)
{
final EventData data = get(event.getClass());
try
{
data.target.invoke(data.source, event); // Error here
}
catch (InvocationTargetException | IllegalAccessException e)
{
e.printStackTrace();
}
}
我还使用了mixins来注册我的事件侦听器类,它工作得很好。
在开发环境中,这工作得很好,并且我的“我的世界”mod可以运行。然而,当我构建我的mod,并试图在我的世界启动程序中使用它时,它崩溃了,崩溃报告为:
java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
dev/mistercow1/sobyity/EventBus.call(Ldev/mistercow1/sobyity/Event;)V @33: invokevirtual
Reason:
Type 'java/lang/Object' (current frame, stack[0]) is not assignable to
'java/lang/ReflectiveOperationException'
dev/mistercow1/sobyity/EventBus.call(Ldev/mistercow1/sobyity/Event;)V @33
是我的call方法中的invoke。
更正:e.printStackTrace();
为dev/mistercow1/sobyity/EventBus.call(Ldev/mistercow1/sobyity/Event;)V @33
在我的proguard映射中,我排除了事件库和混入包(这样它们就不会被混淆),因为这是运行minecraft所必需的,因为它是使用shadowjar打包到jar中的。我还禁用了收缩和优化,并将类重新打包到基目录(dev.misercow1.minecraftmod)中。
在我的mod的去模糊版本和开发环境中,一切都工作得很好,所以我很困惑为什么模糊版本不能工作。
我已经尝试过使用data.target.invoke(null, event);
,但没有任何效果。
这是我的事件系统或我的世界mod的问题,还是proguard的问题?
有没有人有解决这个问题的办法?
编辑:对事件包使用-keep是无效的,因为我没有使用像Method m = ReflectMethodinvokeExample1.class.getDeclaredMethod("process", String.class);
这样的东西来查找要调用的方法。
发布于 2021-09-13 21:09:52
我通过将C:\Program Files\Java\jdk-16.0.2\jmods
中的所有jmod添加到-libraryjars
修复了这个问题,如下所示:
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.base.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.compiler.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.datatransfer.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.desktop.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.instrument.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.logging.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.management.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.management.rmi.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.naming.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.net.http.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.prefs.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.rmi.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.scripting.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.se.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.security.jgss.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.security.sasl.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.smartcardio.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.sql.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.sql.rowset.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.transaction.xa.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.xml.crypto.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\java.xml.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.accessibility.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.attach.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.charsets.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.compiler.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.crypto.cryptoki.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.crypto.ec.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.crypto.mscapi.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.dynalink.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.editpad.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.hotspot.agent.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.httpserver.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.incubator.foreign.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.incubator.vector.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.internal.ed.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.internal.jvmstat.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.internal.le.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.internal.opt.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.internal.vm.ci.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jartool.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.javadoc.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jcmd.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jconsole.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jdeps.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jdi.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jdwp.agent.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jfr.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jlink.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jpackage.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jshell.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jsobject.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.jstatd.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.localedata.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.management.agent.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.management.jfr.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.management.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.naming.dns.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.naming.rmi.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.net.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.nio.mapmode.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.sctp.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.security.auth.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.security.jgss.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.unsupported.desktop.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.unsupported.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.xml.dom.jmod'
-libraryjars 'C:\Program Files\Java\jdk-16.0.2\jmods\jdk.zipfs.jmod'
编辑:只需在build.gradle的proguard任务中添加以下内容:
fileTree("${System.properties['java.home']}\\jmods\\") {
forEach() {
libraryjars "${it.path}"
}
}
https://stackoverflow.com/questions/69146614
复制相似问题