Parcelable踩坑

問題

************* Crash Log Head ****************
Device Manufacturer: alps
Device Model       : S21
Android Version    : 8.0.0
Android SDK        : 26
App VersionName    : 1.0.11
App VersionCode    : 9
************* Crash Log Head ****************

java.lang.RuntimeException: Error receiving broadcast Intent { act=com.zp.android.scmp.Action_Task_Finished flg=0x10 (has extras) } in com.zp.android.scmp.module.seccheck.view.SecCheckFragment$4@1000f40
	at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_51697(LoadedApk.java:1334)
	at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.$m$0(Unknown Source:4)
	at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.run(Unknown Source:0)
	at android.os.Handler.handleCallback(Handler.java:869)
	at android.os.Handler.dispatchMessage(Handler.java:101)
	at android.os.Looper.loop(Looper.java:206)
	at android.app.ActivityThread.main(ActivityThread.java:6760)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:845)
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@83c61b3: Unmarshalling unknown type code 6226009 at offset 2760
	at android.os.Parcel.readValue(Parcel.java:2763)
	at com.zp.android.scmp.data.model.ExecUser.<init>(ExecUser.java:57)
	at com.zp.android.scmp.data.model.ExecUser$1.createFromParcel(ExecUser.java:63)
	at com.zp.android.scmp.data.model.ExecUser$1.createFromParcel(ExecUser.java:61)
	at android.os.Parcel.createTypedArrayList(Parcel.java:2401)
	at com.zp.android.scmp.data.model.Task.<init>(Task.java:114)
	at com.zp.android.scmp.data.model.Task$1.createFromParcel(Task.java:35)
	at com.zp.android.scmp.data.model.Task$1.createFromParcel(Task.java:33)
	at android.os.Parcel.readParcelable(Parcel.java:2790)
	at android.os.Parcel.readValue(Parcel.java:2684)
	at android.os.Parcel.readArrayMapInternal(Parcel.java:3051)
	at android.os.BaseBundle.unparcel(BaseBundle.java:257)
	at android.os.Bundle.getParcelable(Bundle.java:888)
	at android.content.Intent.getParcelableExtra(Intent.java:7075)
	at com.zp.android.scmp.module.seccheck.view.SecCheckFragment$4.onReceive(SecCheckFragment.java:140)
	at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_51697(LoadedApk.java:1323)
	... 9 more
java.lang.RuntimeException: Parcel android.os.Parcel@83c61b3: Unmarshalling unknown type code 6226009 at offset 2760
	at android.os.Parcel.readValue(Parcel.java:2763)
	at com.zp.android.scmp.data.model.ExecUser.<init>(ExecUser.java:57)
	at com.zp.android.scmp.data.model.ExecUser$1.createFromParcel(ExecUser.java:63)
	at com.zp.android.scmp.data.model.ExecUser$1.createFromParcel(ExecUser.java:61)
	at android.os.Parcel.createTypedArrayList(Parcel.java:2401)
	at com.zp.android.scmp.data.model.Task.<init>(Task.java:114)
	at com.zp.android.scmp.data.model.Task$1.createFromParcel(Task.java:35)
	at com.zp.android.scmp.data.model.Task$1.createFromParcel(Task.java:33)
	at android.os.Parcel.readParcelable(Parcel.java:2790)
	at android.os.Parcel.readValue(Parcel.java:2684)
	at android.os.Parcel.readArrayMapInternal(Parcel.java:3051)
	at android.os.BaseBundle.unparcel(BaseBundle.java:257)
	at android.os.Bundle.getParcelable(Bundle.java:888)
	at android.content.Intent.getParcelableExtra(Intent.java:7075)
	at com.zp.android.scmp.module.seccheck.view.SecCheckFragment$4.onReceive(SecCheckFragment.java:140)
	at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_51697(LoadedApk.java:1323)
	at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.$m$0(Unknown Source:4)
	at android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk.run(Unknown Source:0)
	at android.os.Handler.handleCallback(Handler.java:869)
	at android.os.Handler.dispatchMessage(Handler.java:101)
	at android.os.Looper.loop(Looper.java:206)
	at android.app.ActivityThread.main(ActivityThread.java:6760)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:845)

注:在android 7.0和8.0上均能復現,android9.0未能復現(懷疑google修復過?)。

原因

在合併分支的時候將類中變量的read和write順序搞亂了。Parcelable序列化時必須保證讀寫順序一致,讀寫類型一致。

參考

How to fix Unmarshalling unknown type code XXX at offset YYY in Android?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章