livefront / bridge

An Android library for avoiding TransactionTooLargeException during state saving and restoration

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 ClassLoaders. 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 πŸ™‚

@brian-livefront

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.