【发布时间】:2013-11-11 21:10:43
【问题描述】:
当我们准备分发它时,我正在通过 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's fastevents
【问题讨论】:
-
我不知道 Proguard,但我敢猜测它混淆了
my.package.info.inventory.Inventory,而getHandlerList()以某种方式引用了它。应用程序运行时,由于混淆,缺少所需的Inventory。 -
似乎一直在建议我将这些文件标记为单独放置,但我不可能标记与事件相关的所有内容,否则我的一半应用程序将保持原样。跨度>
-
这个 API 库是否被外部调用,I.E.从 JAR 之外?如果是这样,那么混淆可能无论如何都不是一种选择。
-
不,它们是内部使用的类,但我认为将事件处理程序/管理器库移动到单独的库是可能的,同时保留实际的单个事件类......虽然我没有不知道现有的类是否仍会中断。