【发布时间】:2016-06-13 19:29:39
【问题描述】:
使用 Proguard 的优化器时,我收到如下运行时错误:
java.lang.NullPointerException
at java.util.EnumMap.<init>(Unknown Source)
at Z.a(SourceFile:44415)
使用 ReTrace 时,我得到以下行作为导致问题的原因:
temp = new EnumMap<anEnum, Object>(anEnum.class);
如果我反编译优化后的代码,我发现如下代码:
line 44414: EnumMap localEnumMap;
line 44415:
line 44416: (localEnumMap = new EnumMap(dc.class)).put(paramdc, paramObject);
我真的不明白这是怎么发生的,也不知道该怎么办。不运行优化器不会出现错误。
【问题讨论】:
-
枚举和混淆器/优化器可能很棘手(使用另一个混淆器,我必须编辑配置文件以确保某些与枚举相关的方法在混淆过程中保持不变)。抱歉,不是答案,而是相关的:stackoverflow.com/questions/19916025/…
-
奇怪的是,它只发生在优化时。仅启用混淆,就没有问题。只有当我删除 -dontoptimize 标志时才会创建错误。我还为枚举添加了 proguard 代码块
-keepclassmembers,allowoptimization enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -
嗯,直到现在还没有答案,所以有些手忙脚乱:显然,在给定(反编译)代码中唯一可能导致 NullPointerException 的是在
dc.class处发生的取消引用。是否有可能(从剩余的代码)得出这个dc是什么,它来自哪里,以及为什么它可能是null? -
是的,dc 是一个枚举,就像上面的 (anEnum.class) 一样。来自反编译代码:
public enum dc { static { { a, b, c, d }[4] = u; } }
标签: java nullpointerexception proguard optimization