gpt4 book ai didi

android - 如何查找类型为 java.lang.RuntimeException : Parcel android. os.Parcel@#### 的崩溃源:在偏移量 YYY 处解码未知类型代码 XXXX

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:02:29 25 4
gpt4 key购买 nike

我们的崩溃报告系统正在记录这种类型的崩溃:

Caused by java.lang.RuntimeException: Parcel android.os.Parcel@8bf0d1f: Unmarshalling unknown type code 6881391 at offset 356
at android.os.Parcel.readValue(Parcel.java:2779)
at android.os.Parcel.readSparseArrayInternal(Parcel.java:3148)
at android.os.Parcel.readSparseArray(Parcel.java:2362)
at android.os.Parcel.readValue(Parcel.java:2757)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3067)
at android.os.BaseBundle.unparcel(BaseBundle.java:257)
at android.os.Bundle.getSparseParcelableArray(Bundle.java:958)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1329)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3244)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:3194)
at android.support.v4.app.Fragment.restoreChildFragmentState(Fragment.java:1444)
at android.support.v4.app.Fragment.onCreate(Fragment.java:1415)
at com.payments.base.BaseFragment.onCreate(BaseFragment.java:68)
at com.payments.app.fragments.TopLevelFragment.onCreate(TopLevelFragment.java:422)
at android.support.v4.app.Fragment.performCreate(Fragment.java:2331)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1386)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3244)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:3194)
at android.support.v4.app.Fragment.restoreChildFragmentState(Fragment.java:1444)
at android.support.v4.app.Fragment.onCreate(Fragment.java:1415)

据我所知:当应用程序从后台恢复并调用 onCreate 时会发生这种情况。我们的应用程序是一个单 Activity 应用程序,所有 UI 都由 fragment 管理。这种崩溃不常见,并且很难在我们的开发环境中重现。

另外 - 我不认为原因是我们创建了一些可打包的对象,而是 Android 组件重新加载,但不确定。

我想知道的是:如何分析这些堆栈跟踪以查明原因?如何利用给定的少量数据?

请注意,堆栈跟踪几乎不会指向我们应用程序中的任何特定行,也不会指向它所在的位置 - 仅指向我们的 Activity 和 fragment 基类的 onCreate 方法

最佳答案

根据我的经验,这样的错误与错误发生时发生的事情无关,而与您的应用程序之前发生的事情有关。特别是当应用程序进入后台时。

但从堆栈跟踪揭示的内容开始。 TopLevelFragment 正在从以前的状态恢复。在此恢复过程中,将恢复 TopLevelFragment 的子 fragment 。在恢复子 fragment 时,当在 Bundle 上调用 getSparseParcelableArray() 以检索 fragment 的已保存 View 状态时,其中一个 fragment 尝试解包的已保存 fragment 状态。这发生在 FragmentManager.java 的第 1329 行。Parcel 在解码自身时不知道如何处理已保存的 fragment 状态。

为了缩小您应该关注的 TopLevelFragment 的子 fragment ,我会在 FragmentManager.java 的第 1329 行放置一个断点并检查 Fragment f 的类型。请记住,您可能有多个子 fragment 正在恢复,因此您想查看哪个 fragment 无法通过第 1329 行。

当然,您必须强制此恢复逻辑始终如一地发生。如果您只是将您的应用程序发送到后台,然后再将其带回前台,则可能不会发生这种情况。因此,您可以按照 Richard R 的建议进行操作,并使用“不保留 Activity ”开发人员选项来强制 Android 销毁和恢复 Activity 。

一旦缩小了问题所在的 fragment 范围,就需要回到应用程序的早期,仔细查看要在 Fragment.onSaveInstanceState() 中放入保存状态的数据类型。希望这能为您指明正确的方向。

如果这是一个 proguard 问题,如果您禁用缩小,您应该会看到错误消失。如果是这种情况,您可能需要在您的自定义 Parcelable 类型之一上使用 proguard 规则或 @Keep 注释。如果错误发生在有和没有缩小的情况下,它可能与 proguard 无关。

关于android - 如何查找类型为 java.lang.RuntimeException : Parcel android. os.Parcel@#### 的崩溃源:在偏移量 YYY 处解码未知类型代码 XXXX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55159506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com