Android 启用proguard空指针异常后

Android 启用proguard空指针异常后,android,proguard,Android,Proguard,java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)” 调试后,我得出结论,这是因为没有使用putextra将值从一个活动传递到另一个活动。此错误仅在启用proguard后发生。我不知道有什么规则可以防止这种情况发生 当前我的proguard文件如下所示: -keep public class * implements com.bumptech.glide.

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, android.util.AttributeSet, 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>;
}
-保持公共类*实现com.bumptech.glide.module.GlideModule
-keep class*扩展com.bumptech.glide.module.AppGlideModule{
(...);
-保持公共枚举com.bumptech.glide.load.ImageHeaderParser$**{
**[]美元价值;
公众*;
}
-保持类com.bumptech.glide.load.data.ParcelFileDescriptorRevender$InternalRevender{
***倒带();
}
-保持公共类pl.droidsonroids.gif.GifIOException{(int,java.lang.String);}
-dontwarn com.squareup.okhttp**
-保持类com.squareup.okhttp.*{*;}
-唐特沃恩·奥基奥。
-dontshrink
-dontoptimize
#未知的东西
-安卓
-允许访问修改
-不要翻转
-keepattributes*注释*
-keep public class*扩展android.app.Activity
-keep public class*扩展android.app.Application
-keep public class*扩展了android.app.Service
-keep public class*扩展了android.content.BroadcastReceiver
-keep public class*扩展了android.content.ContentProvider
-keep public class*扩展了android.view.view{
public(android.content.Context);
public(android.content.Context、android.util.AttributeSet);
public(android.content.Context,android.util.AttributeSet,int);
公共无效集*(…);
}
-keepclassswithmembers类*{
public(android.content.Context、android.util.AttributeSet);
}
-keepclassswithmembers类*{
public(android.content.Context,android.util.AttributeSet,int);
}
-keepclassmembers类*扩展了android.content.Context{
public void*(android.view.view);
public void*(android.view.MenuItem);
}
-keepclassmembers类*实现android.os.Parcelable{
静态**创建者;
}
-keepclassmembers类**.R$*{
公共静态;
}
-keepclassmembers类*{
@android.webkit.JavascriptInterface;
}
我不太了解proguard。我已经按照第三方库的要求添加了规则。除此之外,我使用firebase和一些带有getter和setter方法的类。Activity的所有成员都是私有的。据我所知,由于无法使用putextra在意图之间传递值,因此会发生空指针异常启用proguard后,因此第二个活动的变量值保持为空


如何解决这个问题并更好地编写proguard规则?

首先,您应该提供更多详细信息。 例如,您有一个名为model的文件夹,其中有一个响应模型类

您的文件树

-model
--Response.java
如果您没有在proguard中指定此项,发布应用程序将无法将其用作引用,因为proguard将更改内存上的键。因此,您应该从proguard中删除您的模型。最后,应用程序不能在内存上错误地引用键,然后您将得到一个空指针错误

-keep class com.name.app.model.** { *; }

因此,模型文件夹不会干扰其在

中的类。首先,您应该提供更多详细信息。 例如,您有一个名为model的文件夹,其中有一个响应模型类

您的文件树

-model
--Response.java
如果您没有在proguard中指定此项,发布应用程序将无法将其用作引用,因为proguard将更改内存上的键。因此,您应该从proguard中删除您的模型。最后,应用程序不能在内存上错误地引用键,然后您将得到一个空指针错误

-keep class com.name.app.model.** { *; }
因此,模型文件夹不会干扰其内部的类