【问题标题】:Proguard Optimizer creates strange NullPointerExceptionProguard Optimizer 创建奇怪的 NullPointerException
【发布时间】: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


【解决方案1】:

当 Enum 类与 EnumMap 或 EnumSet 结合使用时,将通过反射使用其T[] values() 方法来检索枚举的所有可能值。

ProGuard 不会检测到这一点,并且可能会从 Enum 类中删除一些方法。这基本上可以在混淆或优化步骤中发生。

为了避免此错误,您可以执行以下操作:

-keepclassmembers enum xxx.yyy.MyEnum {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

这将防止 Enum 类的 values()valueOf(String) 方法被混淆或删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多