gpt4 book ai didi

使用 Kotlin @Parcelize 解码时的 Android 10 BadParcelableException ClassNotFoundException

转载 作者:行者123 更新时间:2023-12-04 03:41:21 55 4
gpt4 key购买 nike

在 Firebase 中,我的生产应用程序(使用 Dexguard)在使用 Parcelable 时遇到了各种崩溃。 .
这些崩溃现在影响了近 200 名用户,并在 Firebase 上分为 3 个条目。
在一个条目中,崩溃仅在三星设备上,在另一个条目中,只有小米设备,在另一个条目中,是更多品牌,但 81% 来自 HMD Global。
所有这些设备都在运行安卓 10 所以这可能是这个操作系统版本的问题。我可以看到崩溃包含在 5 或 6 个自定义对象中。除此之外,一些崩溃与以下有关:

Fatal Exception: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: androidx.fragment.app.FragmentManagerState
at android.os.Parcel.readParcelableCreator(Parcel.java:3059)
at android.os.Parcel.readParcelable(Parcel.java:2981)
at android.os.Parcel.readValue(Parcel.java:2883)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3261)
at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
at android.os.BaseBundle.unparcel(BaseBundle.java:236)
at android.os.BaseBundle.size(BaseBundle.java:355)
at android.app.servertransaction.LaunchActivityItem.hashCode(LaunchActivityItem.java:208)
at java.util.AbstractList.hashCode(AbstractList.java:541)
at java.util.Objects.hashCode(Objects.java:98)
at android.app.servertransaction.ClientTransaction.hashCode(ClientTransaction.java:241)
at android.app.servertransaction.TransactionExecutorHelper.tId(TransactionExecutorHelper.java:266)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:86)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2220)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8019)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
在我的一个自定义对象中,我遇到了这种类型的崩溃(对于我的其他自定义对象,崩溃是相同的)。
Fatal Exception: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.mypackagename.InfoData
at android.os.Parcel.readParcelableCreator(Parcel.java:3059)
at android.os.Parcel.readParcelable(Parcel.java:2981)
at android.os.Parcel.readValue(Parcel.java:2883)
at android.os.Parcel.readArrayMapInternal(Parcel.java:3261)
at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
at android.os.BaseBundle.unparcel(BaseBundle.java:236)
at android.os.BaseBundle.size(BaseBundle.java:355)
at android.app.servertransaction.LaunchActivityItem.hashCode(LaunchActivityItem.java:208)
at java.util.AbstractList.hashCode(AbstractList.java:541)
at java.util.Objects.hashCode(Objects.java:98)
at android.app.servertransaction.ClientTransaction.hashCode(ClientTransaction.java:241)
at android.app.servertransaction.TransactionExecutorHelper.tId(TransactionExecutorHelper.java:266)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:86)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2220)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8019)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
例如,这里是我遇到崩溃的模型示例。
@Parcelize
class NumberDetails(internal var numbers: ArrayList<String> = arrayListOf(), var userState: UserState = UserState.INACTIVE) : Parcelable {

fun clear() = numbers.clear()

fun getNumbers(): String = numbers.joinToString("")
}
其他:
@Parcelize
data class InfoData(var needsCheck: Boolean = false, var amount: Double = 0.0, var fee: Double? = null) : Parcelable
还有一个:
abstract class Screen(open val identifier: String = "") : Parcelable {

@Parcelize
data class ActivateScreen(override val identifier: String) : Screen()


//More entries like above
}
第一个例子是一个内部类,而第二个是在我已经有其他东西的文件中声明的(不知道这是否重要)
我无法在我的任何设备上复制崩溃。
知道为什么我只在 Android 10 设备上出现这些崩溃吗?
更新:
在尝试修复我的应用程序发生的崩溃时,我能够重现 FragmentManagerState崩溃,也就是说,我的应用程序崩溃了,然后它又崩溃了 FragmentManagerState碰撞。虽然我总是可以复制我的应用程序崩溃,但随后的崩溃我只能复制一次。
这在运行 Android 10 并启用了不保持 Activity 的模拟器中进行了复制。
我的应用程序崩溃只是由于启用了不保持 Activity 而发生(在我工作的市场中,由于低端设备,这是常见的情况)
在我的应用程序中,我可以执行以下步骤:

ActivityA -> ActivityB -> ActivityC -> ActivityD (PdfViewer) ->PickActivity (I/ActivityTaskManager: START u0{act=android.intent.action.CREATE_DOCUMENTcat=[android.intent.category.OPENABLE] typ=application/pdfcmp=com.android.documentsui/.picker.PickActivity)


ActivityD ,一个可以预览 PDF 的地方,我可以单击一个按钮将 PDF 保存到存储中。点击按钮打开系统 PickActivity .当我保存 PDF 并将控制权传递给 ActivityC ,我的应用程序崩溃(仅在启用 DNKA 的情况下),因为我没有正确处理 onSavedInstanceState .
从日志中(这里删除了不必要的东西)我可以看到:
I/ActivityTaskManager: START u0 {act=android.intent.action.CREATE_DOCUMENT cat=[android.intent.category.OPENABLE] typ=application/pdf cmp=com.android.documentsui/.picker.PickActivity (has extras)} from uid 10219
I/ActivityManager: Start proc 9418:com.android.documentsui/u0a50 for activity {com.android.documentsui/com.android.documentsui.picker.PickActivity}
I/ActivityManager: Start proc 9443:com.android.externalstorage/u0a56 for content provider {com.android.externalstorage/com.android.externalstorage.ExternalStorageProvider}
I/ActivityTaskManager: Displayed com.android.documentsui/.picker.PickActivity: +1s133ms
2016-3548/? I/ActivityTaskManager: START u0 {cmp=com.myapp.packagename/com.myapp.package.ActivityC} from uid 10219
2016-2323/? I/ActivityTaskManager: START u0 {cmp=com.myapp.packagename/com.myapp.package.ActivityC} from uid 10219
然后我的应用程序由于缺乏对保存的实例状态的正确处理而崩溃
W/ActivityTaskManager: Activity top resumed state loss timeout for ActivityRecord{bdaedc1 u0 com.myapp.packagename/com.myapp.package.ActivityD t1250}
W/ActivityTaskManager: Activity pause timeout for ActivityRecord{bdaedc1 u0 com.myapp.packagename/com.myapp.package.ActivityD t1250}
W/ActivityTaskManager: Force finishing activity com.myapp.packagename/com.myapp.package.ActivityC
W/ActivityTaskManager: Force finishing activity com.myapp.packagename/com.myapp.package.ActivityC
I/ActivityManager: Process com.myapp.packagename (pid 8990) has died: fore TOP
W/ActivityTaskManager: Force removing ActivityRecord{4b658e u0 com.myapp.packagename/com.myapp.package.ActivityB t1250}: app died, no saved state
W/ActivityTaskManager: Force removing ActivityRecord{210b4e5 u0 com.myapp.packagename/com.myapp.package.Activitya t1250}: app died, no saved state
I/ActivityManager: Start proc 9609:com.myapp.packagename/u0a219 for activity {com.myapp.packagename/com.myapp.package.ActivityD}
W/ActivityTaskManager: Activity top resumed state loss timeout for ActivityRecord{5d7ded3 u0 com.myapp.packagename/com.myapp.package.ActivityC t-1 f}
我现在可以通过日志看到我的应用程序已启动(来自我的应用程序类的日志)
I/ActivityTaskManager: START u0 {flg=0x10008000 cmp=com.myapp.packagename/com.myapp.package.SplashActivity} from uid 10219
I/ActivityTaskManager: START u0 {cmp=com.myapp.packagename/com.myapp.package.SplashActivity} from uid 10219
W/ActivityTaskManager: startActivity called from finishing ActivityRecord{bdaedc1 u0 com.myapp.packagename/com.myapp.package.ActivityD t1250 f}; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { cmp=com.myapp.packagename/com.myapp.package.SplashActivity }
W/ActivityTaskManager: Duplicate finish request for ActivityRecord{bdaedc1 u0 com.myapp.packagename/com.myapp.package.ActivityD t1250 f}
W/ActivityTaskManager: Duplicate finish request for ActivityRecord{685f9ab u0 com.myapp.packagename/com.myapp.package.ActivityC t1250 f}
W/ActivityTaskManager: Activity top resumed state loss timeout for ActivityRecord{bdaedc1 u0 com.myapp.packagename/com.myapp.package.ActivityD t1250 f}
W/ActivityTaskManager: Activity pause timeout for ActivityRecord{bdaedc1 u0 com.myapp.packagename/com.myapp.package.ActivityD t1250 f}
接着:
9609-9609/com.myapp.packagename E/Parcel: Class not found when unmarshalling: androidx.fragment.app.FragmentManagerState
java.lang.ClassNotFoundException: androidx.fragment.app.FragmentManagerState
在分析日志时,我可以看到我的一项 Activity 出现了两次。我设法通过快速多次单击启动该 Activity 的按钮来重现这一点。然后我尝试复制它。重新启动流程,双击按钮,尝试保存 PDF,应用程序崩溃后,我可以看到 FragmentManagerState 崩溃。我只能重现一次。
1 - 由于我所有的崩溃都与 BadParcelableException 相关(来自 FragmentManagerState 的崩溃和其他来自其他事物的崩溃),并且考虑到上述情况,我在 Play 商店中看到的崩溃是否可以标记为 BadParcelableException 但与相关的崩溃我的应用程序中的其他内容也会触发 BadParcelableException 崩溃,而 PlayStore 和 Firebase 仅显示后面的内容?
2 - 关于我可以改进什么以正确记录我的应用程序中的崩溃有什么建议吗?

最佳答案

这个问题was reported a year ago对于您的第一个堆栈跟踪,指的是 FragmentManagerState .它似乎与特定于 Android 10 的错误有关。
为您的InfoState崩溃,将对象作为 byte[] 放入包中应该解决问题。 FragmentManagerState 不适合你。 ,不过,因为这在 Jetpack 中做得更深。
您可能想确认您使用的是最新的 androidx.fragmentandroidx.activity库,以防他们添加了解决方法。否则,您可能会查看有关该问题的评论,因为一些开发人员报告了一些解决方案,但它们相当具体,可能与您的场景相关,也可能不相关。

关于使用 Kotlin @Parcelize 解码时的 Android 10 BadParcelableException ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65981617/

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