提问者:小点点

为什么使用proguard混淆时调用不起作用


我有一个用于Minecraft的Fabric 1.17.1(Java 16)mod,我正在试图混淆它。这个mod包括我的事件系统,它处理我的mod的所有事件。此事件系统使用invoke方法在运行时调用我的事件侦听器类中的事件。

这是我使用 call 方法调用的事件:

@EventHandler
public static void onMinecraftInitialization(EventMinecraftInitialization event)
{
    // Do stuff
}

以下是调用方法:

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();
    }
}

我还使用mixin来注册我的事件侦听器类,这很好。

在开发环境中,这很好用,我的minecraft mod也能运行。然而,当我构建我的mod并试图在Minecraft启动器中使用它时,它崩溃了,崩溃报告为:

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 是我的调用方法中的调用。

更正:dev/mistercow1/sobyity/EventBus.call(Ldev/mistercow1/sobyity/Event;)V @33e.printStackTrace();

在我的proguard映射中,我排除了事件库和mixin包(这样它们就不会被混淆),因为这是minecraft运行所必需的,因为它是使用shadowjar打包到jar中的。我还禁用了收缩和优化,并将类重新打包到基本目录中(dev.mistercow1.minecraftmod)

在我的mod的去模糊版本和开发环境中,一切都很好,所以我很困惑为什么模糊版本不起作用。

我已经试过使用< code>data.target.invoke(null,event);取而代之,但是没有效果。

这是我的事件系统或minecraft mod的问题还是proguard的问题?

有人能解决这个问题吗?

编辑:对事件包使用 -keep 是无效的,因为我没有使用类似 方法 m = ReflectMethodinvokeExample1.class.getDeclaredMethod(“process”, String.class); 来查找要调用的方法。


共1个答案

匿名用户

我通过将 C:\Program Files\Java\jdk-16.0.2\jmods 中的所有 jmods 添加到 -libraryjar 来解决此问题,例如:

-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}"
    }
}