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.
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.