Intent.getParcelableExtra 发生空指针异常

583 阅读1分钟

现象描述

第一次进入页面调用 Intent.getParcelableExtra 接口正常解析数据,退出页面重新进来后再次调用接口,提示空指针异常: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Class.isInterface()' on a null object reference

错误堆栈信息如下


E  FATAL EXCEPTION: main
                                                                                                    Process: com.realtek.apps.dev, PID: 27164
                                                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Class.isInterface()' on a null object reference
                                                                                                    	at java.lang.Class.isAssignableFrom(Class.java:589)
                                                                                                    	at android.os.Parcel.readParcelableCreatorInternal(Parcel.java:4850)
                                                                                                    	at android.os.Parcel.readParcelableInternal(Parcel.java:4763)
                                                                                                    	at android.os.Parcel.readValue(Parcel.java:4529)
                                                                                                    	at android.os.Parcel.readValue(Parcel.java:4312)
                                                                                                    	at android.os.Parcel.-$$Nest$mreadValue(Unknown Source:0)
                                                                                                    	at android.os.Parcel$LazyValue.apply(Parcel.java:4407)
                                                                                                    	at android.os.Parcel$LazyValue.apply(Parcel.java:4366)
                                                                                                    	at android.os.BaseBundle.getValueAt(BaseBundle.java:394)
                                                                                                    	at android.os.BaseBundle.getValue(BaseBundle.java:374)
                                                                                                    	at android.os.BaseBundle.getValue(BaseBundle.java:357)
                                                                                                    	at android.os.BaseBundle.get(BaseBundle.java:693)
                                                                                                    	at android.os.Bundle.getParcelable(Bundle.java:947)
                                                                                                    	at android.content.Intent.getParcelableExtra(Intent.java:8902)
                                                                                                    	at com.xxx.sdk.support.compat.content.IntentCompat.getParcelableExtra(SourceFile:2)
                                                                                                    	at com.xxx.apps.dev.intent.IntentSecondaryActivity.onCreate$lambda$2(IntentSecondaryActivity.kt:102)
                                                                                                    	at com.xxx.apps.dev.intent.IntentSecondaryActivity.$r8$lambda$WPPZCL-Q2_nm7nv-N6U2nkNeXoE(Unknown Source:0)
                                                                                                    	at com.xxx.apps.dev.intent.IntentSecondaryActivity$$ExternalSyntheticLambda2.onClick(Unknown Source:2)
                                                                                                    	at android.view.View.performClick(View.java:7506)
                                                                                                    	at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1211)
                                                                                                    	at android.view.View.performClickInternal(View.java:7483)
                                                                                                    	at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
                                                                                                    	at android.view.View$PerformClick.run(View.java:29335)
                                                                                                    	at android.os.Handler.handleCallback(Handler.java:942)
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                    	at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                    	at android.os.Looper.loop(Looper.java:288)
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:7898)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

原因分析

Parcelable 对象和 CREATOR 都不能被混淆,如果需要被混淆,请按照下面的格式处理

-keep class com.xxx.MyParcelable {
      public *;
}
-keep class com.xxx.MyParcelable$* {
    public *;
}