gpt4 book ai didi

java - proguard 在动态声明的方法上导致 EnumMap NPE

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:12 26 4
gpt4 key购买 nike

我在准备分发时通过 proguard/maven 向 java 应用程序添加混淆。在此过程中,它会出错:

注意:...eventlib.EventManager 动态访问声明的方法“getHandlerList()”

然后它用 Maybe this is... 列出了十几个具有该方法的类,它建议使用 -keep 来避免这个问题。

当我添加 -keep public class my.package.info.eventlib.HandlerList { *; 到构建过程,错误消失了,但我看到以下通知:

[proguard] 注意:配置保留入口点 'events.TransactionEvent { TransactionEvent(my.package.info.inventory.Inventory,my.package.info.inventory.Inventory$TransactionType,my.package. info.inventory.ItemDefinition,短); }',但不是描述符类'my.package.info.inventory.Inventory'

当我运行该应用程序时,它会出现 NPE 错误(在没有混淆的情况下运行时不会出现这种情况):

Caused by: java.lang.NullPointerException
at java.util.EnumMap.<init>(EnumMap.java:113)
at my.package.info.eventlib.HandlerList.<init>(Unknown Source)
at my.package.info.events.CollisionEvent.<clinit>(Unknown Source)

这一切都与事件有关。我如何在不告诉混淆器将所有内容都与它们绑定(bind)的情况下解决这个问题?

这是原始错误的完整示例:http://pste.me/m9BsY/

事件系统基于lahwran's fastevents

最佳答案

ProGuard 注意到您的代码动态访问了一个方法,但它无法确定具体是哪个方法。如果它重命名甚至删除方法,代码中的反射将失败,因此您需要保留正确的方法。也许您想保留所有列出的候选人:

-keepclassmembers class * {
*** getHandlerList();
}

请参阅 ProGuard 文档 > 故障排除 > Note: ... accesses a field/method '...' dynamically

ProGuard 还注意到您的配置保留了类的构造函数,但不是所有的参数类型。对于某些类型的反射,您还需要保留这些参数类型。您更有可能只是通过使用通配符不小心保留了构造函数。那会有点草率,但无害。

请参阅 ProGuard 文档 > 故障排除 > Note: the configuration keeps the entry point '...', but not the descriptor class '...'

为了解决 NullPointerException,您必须知道 HandlerList 中的代码发生了什么。您可以让 ProGuard 使用

保留行号
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

如果代码或库进行了反射,并且原始类名很重要,您可能需要保留它们。例如。如果事件类的名称很重要:

-keep class my.package.info.events.*

关于java - proguard 在动态声明的方法上导致 EnumMap NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19916025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com