Search code examples
javaandroidkotlinandroid-viewparcelable

Parcel android.os.Parcel@72a6e36: Unmarshalling unknown type code 2131365270 at offset 500


I get almost the same issue as in 20 other topics, which point to the RuntimeException: Parcel android.os.Parcel@72a6e36: Unmarshalling unknown type code, however with a different offset (500):

Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@72a6e36: Unmarshalling unknown type code 2131365270 at offset 500
    at android.os.Parcel.readValue(Parcel.java:2443)
    at android.os.Parcel.readSparseArrayInternal(Parcel.java:2798)
    at android.os.Parcel.readSparseArray(Parcel.java:2067)
    at android.os.Parcel.readValue(Parcel.java:2421)
    at android.os.Parcel.readArrayMapInternal(Parcel.java:2717)
    at android.os.BaseBundle.unparcel(BaseBundle.java:269)
    at android.os.Bundle.getSparseParcelableArray(Bundle.java:910)
    at com.android.internal.policy.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2129)
    at android.app.Activity.onRestoreInstanceState(Activity.java:1047)
    at android.app.Activity.performRestoreInstanceState(Activity.java:1002)
    at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1174)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2619)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 

Still, these topics didn't give me a solution to my case.

My problem started occurring after converting 2 classes from Java to Kotlin, which inherited from ViewGroup and View and only in an obfuscated version of the app.
My proguard config had a rule:

-keepclassmembers class * implements android.os.Parcelable {
  static ** CREATOR;
}

So it wasn't the case. The problem was quite difficult to detect.


Solution

  • It turned out, that it was connected to Parcelable CREATOR code. After converting classes to Kotlin, the converter did it like this:

    companion object {
      val CREATOR: Parcelable.Creator<SavedState> = object : Parcelable.Creator<SavedState> {
        override fun createFromParcel(inParcel: Parcel): SavedState? {
          return SavedState(inParcel)
        }
    
        override fun newArray(size: Int): Array<SavedState?> {
          return arrayOfNulls(size)
        }
      }
    }
    

    Long story short, I run lint on the project (from gradle tasks) and it gave me the right answer with an exact line in the code:

    Error: Field should be annotated with @JvmField [ParcelCreator]
    val CREATOR: Parcelable.Creator<SavedState> = object : Parcelable.Creator<SavedState> {
    

    So all in all, the CREATOR field should be annotated with @JvmField and look like this:

    companion object {
      @JvmField
      val CREATOR: Parcelable.Creator<SavedState> = object : Parcelable.Creator<SavedState> {
        override fun createFromParcel(inParcel: Parcel): SavedState? {
          return SavedState(inParcel)
        }
    
        override fun newArray(size: Int): Array<SavedState?> {
          return arrayOfNulls(size)
        }
      }
    }
    

    This resolved my issue. No thread on stack overflow mentioned about lint so if you are stuck and haven't tried lint, maybe this could help.