Java Proguard优化器创建奇怪的NullPointerException
在使用Proguard的优化器时,我得到如下运行时错误:Java Proguard优化器创建奇怪的NullPointerException,java,nullpointerexception,proguard,optimization,Java,Nullpointerexception,Proguard,Optimization,在使用Proguard的优化器时,我得到如下运行时错误: java.lang.NullPointerException at java.util.EnumMap.<init>(Unknown Source) at Z.a(SourceFile:44415) -keepclassmembers enum xxx.yyy.MyEnum { public static **[] values(); public static ** valueOf(java
java.lang.NullPointerException
at java.util.EnumMap.<init>(Unknown Source)
at Z.a(SourceFile:44415)
-keepclassmembers enum xxx.yyy.MyEnum {
public static **[] values();
public static ** valueOf(java.lang.String);
}
我真的不明白这是怎么发生的,也不知道该怎么办。如果不运行优化器,则不会出现错误。当枚举类与枚举映射或枚举集结合使用时,其
T[]values()
方法将通过反射来检索枚举的所有可能值
ProGuard不会检测到这一点,可能会从Enum类中删除一些方法。这基本上可以发生在模糊或优化步骤中
为了避免此错误,可以执行以下操作:
java.lang.NullPointerException
at java.util.EnumMap.<init>(Unknown Source)
at Z.a(SourceFile:44415)
-keepclassmembers enum xxx.yyy.MyEnum {
public static **[] values();
public static ** valueOf(java.lang.String);
}
这将防止枚举类的
values()
和valueOf(String)
方法被混淆或删除。枚举和混淆器/优化器可能很棘手(对于另一个混淆器,我必须编辑配置文件,以确保某些与枚举相关的方法在混淆期间保持不变)。抱歉,这不是答案,而是相关的:奇怪的是,它只发生在优化时。只要启用模糊处理,就没有问题。只有在删除-dontoptimize标志时,才会创建错误。我还为enum-keepclassmembers添加了proguard代码块,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;}