4

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

Note: ...eventlib.EventManager accesses a declared method 'getHandlerList()' dynamically

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

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

[proguard] Note: the configuration keeps the entry point 'events.TransactionEvent { TransactionEvent(my.package.info.inventory.Inventory,my.package.info.inventory.Inventory$TransactionType,my.package.info.inventory.ItemDefinition,short); }', but not the descriptor class '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)

这一切都与事件有关。如果不告诉 proguard 将所有内容与他们联系起来,我该如何解决这个问题?

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

事件系统基于lahwran的fastevents

4

2 回答 2

1

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

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

请参阅 ProGuard 文档 > 疑难解答 >注意:...动态访问字段/方法“...”

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

请参阅 ProGuard 文档 > 故障排除 >注意:配置保留入口点“...”,但不保留描述符类“...”

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

-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

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

-keep class my.package.info.events.*
于 2013-11-21T00:38:35.093 回答
0

我只是NullPointerExceptionEnumMap构造函数中具有相同的内容,并且可以使用以下方法对其进行修复:

-keepclassmembers enum * {
   public static **[] values(); 
}
于 2022-03-01T09:17:35.710 回答