问题描述
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ boolean java.lang.String.equals(java.lang.Object)”
调试之后,我得出的结论是,这是因为没有使用putextra将值从一个活动传递到另一个活动。仅在启用proguard后才会发生此错误。我不知道有任何保留规则可以防止这种情况。
目前我的proguard文件如下:
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep class * extends com.bumptech.glide.module.AppGlideModule {
<init>(...);
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder {
*** rewind();
}
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int,java.lang.String);}
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp.* { *;}
-dontwarn okio.
-dontshrink
-dontoptimize
# unkNown stuff
-android
-allowaccessmodification
-dontpreverify
-keepattributes *Annotation*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.broadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context,android.util.AttributeSet);
public <init>(android.content.Context,android.util.AttributeSet,int);
public void set*(...);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context,android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context,int);
}
-keepclassmembers class * extends android.content.Context {
public void *(android.view.View);
public void *(android.view.MenuItem);
}
-keepclassmembers class * implements android.os.Parcelable {
static ** CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
我不太了解proguard。我已添加了第三方库要求的规则。除此之外,我使用firebase和一些带有getter和setter方法的类。活动的所有成员均为私人。据我了解,由于启用proguard后无法使用putextra在意图之间传递值,因此发生了空指针异常,因此第二个活动的变量值保持为空。
如何解决此问题并更好地编写proguard规则?
解决方法
首先,您应该提供更多详细信息。 例如,您有一个名为model的文件夹,而内部有一个响应模型类。
您的FileTree
-model
--Response.java
如果您未在proguard中指定此选项,则发布应用程序将无法将其用作参考,因为proguard会更改内存上的键。因此您应该从proguard中删除模型。最后,该应用程序不能错误地引用内存上的键,此后,您将得到一个空指针错误。
-keep class com.name.app.model.** { *; }
因此,模型文件夹不会干扰其中的类