Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I'm having app crash on resume because of Unmarshalling exception. I've checked all the Serializables have constructor with no parameters and even checked all the serializables using ObjectStream (save to file and load from file). How can i understand actual class type for parcelable offset that cause exception:

Parcel android.os.Parcel@42209460: Unmarshalling unknown type code  2131165303 at offset 3748          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2080)          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2105)          at android.app.ActivityThread.access$600(ActivityThread.java:136)          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)          at android.os.Handler.dispatchMessage(Handler.java:99)          at android.os.Looper.loop(Looper.java:137)          at android.app.ActivityThread.main(ActivityThread.java:4876)          at java.lang.reflect.Method.invokeNative(Native Method)          at java.lang.reflect.Method.invoke(Method.java:511)          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:804)          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:571)          at com.kdgdev.xtension.core.XtensionMain.main(XtensionMain.java:91)          at dalvik.system.NativeStart.main(Native Method)         Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@42209460: Unmarshalling unknown type code 2131165303  at offset 3748          at android.os.Parcel.readValue(Parcel.java:2032)          at android.os.Parcel.readSparseArrayInternal(Parcel.java:2255)          at android.os.Parcel.readSparseArray(Parcel.java:1687)          at android.os.Parcel.readValue(Parcel.java:2022)          at android.os.Parcel.readMapInternal(Parcel.java:2226)          at android.os.Bundle.unparcel(Bundle.java:223)          at android.os.Bundle.getSparseParcelableArray(Bundle.java:1232)         at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1690)          at android.app.Activity.onRestoreInstanceState(Activity.java:999)          at com.actionbarsherlock.app.SherlockFragmentActivity.onRestoreInstanceState(Unknown  Source)          at name.myname.android.app.ui.MainActivity.onRestoreInstanceState(Unknown  Source)          at android.app.Activity.performRestoreInstanceState(Activity.java:971)          at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1130)          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2058)        ... 12 more 

Saved data consists of Bundles and Serializables and all of them look good.

I'm going to do the next:

try { // unmarshalling } catch (Throwable t) { // look offset  } 

How can i understand what type is actually for Parcelable offset?

like image 524
4ntoine Avatar asked Feb 18 '14 05:02

4ntoine


2 Answers

There's some rules for write and read parcelables.

1- Be careful about type mismatch. If you write int, don't try to read long etc.

2- Be careful about order of writes and reads. Objects must be at the same sort order when reading and writing.

Both of these can cause "Unmarshalling unknown type code".

like image 172
asozcan Avatar answered Sep 17 '22 20:09

asozcan


It's because of Proguard obfuscation - it processed Parcelable. solution: Proguard causing RuntimeException (Unmarshalling unknown type code) in Parcelable class

like image 38
4ntoine Avatar answered Sep 17 '22 20:09

4ntoine