【问题标题】:After enabling proguard null pointer exception启用proguard空指针异常后
【发布时间】:2020-09-21 15:53:53
【问题描述】:

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>;
}

我不太了解proguard。我已根据第三方库的要求添加了规则。除此之外,我使用 firebase 和一些带有 getter 和 setter 方法的类。 Activity 的所有成员都是私有的。据我了解,由于在启用 proguard 后无法使用 putextra 在 Intent 之间传递值而发生空指针异常,因此第二个活动的变量值保持为空。

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

【问题讨论】:

    标签: android proguard


    【解决方案1】:

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

    您的文件树

    -model
    --Response.java
    

    如果你没有在 proguard 中指定这个,release 应用程序将无法使用它作为参考,因为 proguard 会更改内存上的键。所以你应该从proguard中删除你的模型。最后,应用程序不能错误地在内存中引用键,然后你会得到一个空指针错误。

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

    因此,模型文件夹不会干扰其内部的类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 2015-07-12
      相关资源
      最近更新 更多