首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用proguard模糊处理时,为什么调用不起作用

使用proguard模糊处理时,为什么调用不起作用
EN

Stack Overflow用户
提问于 2021-09-11 20:48:03
回答 1查看 142关注 0票数 4

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

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

代码语言:javascript
运行
复制
@EventHandler
public static void onMinecraftInitialization(EventMinecraftInitialization event)
{
    // Do stuff
}

下面是call方法:

代码语言:javascript
运行
复制
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,并试图在我的世界启动程序中使用它时,它崩溃了,崩溃报告为:

代码语言:javascript
运行
复制
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);这样的东西来查找要调用的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-13 21:09:52

我通过将C:\Program Files\Java\jdk-16.0.2\jmods中的所有jmod添加到-libraryjars修复了这个问题,如下所示:

代码语言:javascript
运行
复制
-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任务中添加以下内容:

代码语言:javascript
运行
复制
fileTree("${System.properties['java.home']}\\jmods\\") {
    forEach() {
        libraryjars "${it.path}"
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69146614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档