Target SDK 33: Parcel - Unmarshalling unknown type code.
a-blekot opened this issue Β· comments
Hello @brian-livefront !
I'm not sure that this issue is about Bridge, but there is a chance that it is somehow related to Bridge))
We started to receive 2 kinds of crashes when we bumped the target SDK to 33.
As I can see crash occurs when the app comes back from the background and Activity is recreated together with Fragments.
I tried to reproduce it with "Don't keep Activities" flag turned ON, but I couldn't...
Crash 1
Devices: Samsung (38%), Xiaomi (38%), Motorola (8%), Oppo (5%), ...
OS: Android 12 (48%), 11 (27%), 10 (16%), 9 (7%), ...
Android 8-12
Fatal Exception: java.lang.RuntimeException
Unable to start activity ComponentInfo{SingleFragmentActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@952ddad: Unmarshalling unknown type code 57 at offset 2204
Caused by java.lang.RuntimeException
Parcel android.os.Parcel@322d31a: Unmarshalling unknown type code 57 at offset 2204
android.os.Parcel.readValue (Parcel.java:3318)
android.os.Parcel.readSparseArrayInternal (Parcel.java:3719)
android.os.Parcel.readSparseArray (Parcel.java:2857)
android.os.Parcel.readValue (Parcel.java:3296)
android.os.Parcel.readArrayMapInternal (Parcel.java:3636)
android.os.BaseBundle.initializeFromParcelLocked (BaseBundle.java:292)
android.os.BaseBundle.unparcel (BaseBundle.java:236)
android.os.Bundle.getSparseParcelableArray (Bundle.java:1080)
androidx.fragment.app.FragmentStateManager.restoreState (FragmentStateManager.java:408)
androidx.fragment.app.FragmentManager.restoreSaveStateInternal (FragmentManager.java:2512)
androidx.fragment.app.Fragment.restoreChildFragmentState (Fragment.java:1989)
androidx.fragment.app.Fragment.onCreate (Fragment.java:1965)
com.myapp.presentation.base.MviCoreFragment.onCreate (MviCoreFragment.kt:149)
com.myapp.presentation.main.MainFragment.onCreate (MainFragment.kt:55)
androidx.fragment.app.Fragment.performCreate (Fragment.java:3090)
androidx.fragment.app.FragmentStateManager.create (FragmentStateManager.java:475)
androidx.fragment.app.FragmentStateManager.moveToExpectedState (FragmentStateManager.java:257)
androidx.fragment.app.FragmentStore.moveToExpectedState (FragmentStore.java:113)
androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java:1433)
androidx.fragment.app.FragmentManager.dispatchStateChange (FragmentManager.java:2977)
androidx.fragment.app.FragmentManager.dispatchCreate (FragmentManager.java:2884)
androidx.fragment.app.FragmentController.dispatchCreate (FragmentController.java:252)
androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:220)
com.myapp.presentation.base.MviCoreActivity.onCreate (MviCoreActivity.kt:81)
com.myapp.presentation.singlefragment.SingleFragmentActivity.onCreate (SingleFragmentActivity.kt:46)
android.app.Activity.performCreate (Activity.java:8290)
android.app.Activity.performCreate (Activity.java:8270)
android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1329)
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:4085)
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:4277)
android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:103)
android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135)
android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:2443)
android.os.Handler.dispatchMessage (Handler.java:106)
android.os.Looper.loopOnce (Looper.java:226)
android.os.Looper.loop (Looper.java:313)
android.app.ActivityThread.main (ActivityThread.java:8751)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:571)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1135)
Crash 2
Devices: Samsung (71%), Google(18%), Xiaomi (5%), Oppo (2%), ...
OS: Android 13
1 second after start
Android 13
Fatal Exception: java.lang.RuntimeException
Unable to start activity ComponentInfo{SingleFragmentActivity}: android.os.BadParcelableException: Parcel android.os.Parcel@d6c614b: Unmarshalling unknown type code 3014757 at offset 2736
Caused by android.os.BadParcelableException
Parcel android.os.Parcel@d6c614b: Unmarshalling unknown type code 3014757 at offset 2736
android.os.Parcel.readValue (Parcel.java:4696)
android.os.Parcel.readValue (Parcel.java:4355)
android.os.Parcel.readSparseArrayInternal (Parcel.java:5411)
android.os.Parcel.readValue (Parcel.java:4651)
android.os.Parcel.readValue (Parcel.java:4347)
android.os.Parcel.-$$Nest$mreadValue
android.os.Parcel$LazyValue.apply (Parcel.java:4445)
android.os.Parcel$LazyValue.apply (Parcel.java:4404)
android.os.BaseBundle.getValueAt (BaseBundle.java:394)
android.os.BaseBundle.getValue (BaseBundle.java:374)
android.os.BaseBundle.getValue (BaseBundle.java:357)
android.os.BaseBundle.getValue (BaseBundle.java:350)
android.os.Bundle.getSparseParcelableArray (Bundle.java:1108)
androidx.fragment.app.FragmentStateManager.restoreState (FragmentStateManager.java:408)
androidx.fragment.app.FragmentManager.restoreSaveStateInternal (FragmentManager.java:2512)
androidx.fragment.app.Fragment.restoreChildFragmentState (Fragment.java:1989)
androidx.fragment.app.Fragment.onCreate (Fragment.java:1965)
com.myapp.presentation.base.MviCoreFragment.onCreate (MviCoreFragment.kt:149)
com.myapp.presentation.main.MainFragment.onCreate (MainFragment.kt:55)
androidx.fragment.app.Fragment.performCreate (Fragment.java:3090)
androidx.fragment.app.FragmentStateManager.create (FragmentStateManager.java:475)
androidx.fragment.app.FragmentStateManager.moveToExpectedState (FragmentStateManager.java:257)
androidx.fragment.app.FragmentStore.moveToExpectedState (FragmentStore.java:113)
androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java:1433)
androidx.fragment.app.FragmentManager.dispatchStateChange (FragmentManager.java:2977)
androidx.fragment.app.FragmentManager.dispatchCreate (FragmentManager.java:2884)
androidx.fragment.app.FragmentController.dispatchCreate (FragmentController.java:252)
androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:220)
com.myapp.presentation.base.MviCoreActivity.onCreate (MviCoreActivity.kt:81)
com.myapp.presentation.singlefragment.SingleFragmentActivity.onCreate (SingleFragmentActivity.kt:46)
android.app.Activity.performCreate (Activity.java:8341)
android.app.Activity.performCreate (Activity.java:8320)
android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1417)
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3622)
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3778)
android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:101)
android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:138)
android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:2303)
android.os.Handler.dispatchMessage (Handler.java:106)
android.os.Looper.loopOnce (Looper.java:201)
android.os.Looper.loop (Looper.java:288)
android.app.ActivityThread.main (ActivityThread.java:7884)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:936)
code in our MviCoreFragment
override fun onCreate(savedInstanceState: Bundle?) {
try {
Bridge.restoreInstanceState(this, savedInstanceState)
} catch (e: Exception) { /* state not recovered due to CancellationException */
}
super.onCreate(savedInstanceState)
}
I started to suspect Bridge because it also retrieves some data from Bundle
, I thought maybe the rest of the Bundle
is corrupted after we call Bridge.restoreInstanceState
π
I see that you retrieve only one String uuid from savedInstanceState
, but maybe it affects Bundle in Android 13 because of different classLoder
or some other reason?
Any suggestions would be appreciated! πππ
@a-blekot Thanks for reporting this! At first glance I don't see anything directly related to Bridge
here but you do bring up an interesting point about the use of different ClassLoader
s. That does happen internal to Bridge
but I would think that would only be relevant to the actual direct calls to Bridge
. In any case, I don't have any specific advice for you at the moment unfortunately, other than to look into any other state saving you might be doing that's not using Bridge
. I can say that I'm in the process of updating some dependencies and SDK versions and could push out a release at some point and you could see if that addresses anything (or if I reproduce this issue perhaps).
I will note that other people reporting issues like this in general (not related to Bridge
) may be having issues with obfuscation so that could be worth looking into.
@brian-livefront Thank you! I will try to add that rule to our proguard and of course we are waiting for update π
Actually, this issue was caused by another lib - Ferfalk/SimpleSearchView#37
so it could be closed! Hope this would be helpful for somebody!
Good to know, thanks for the update @a-blekot! I appreciate you keeping me in the loop on that.