在Firebase中,我会在我的生产应用程序(使用Parcelable )中遇到各种崩溃。
这些崩溃现在影响到了近200个用户,并在Firebase上被分组为3个条目。
在一个条目中,崩溃只发生在三星设备上,在另一个,只有小米设备,而在另一个,是更多的品牌,但81%来自HMD全球。
所有这些设备都在运行Android 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的仿真程序中复制的,并且启用了不要保持活动。我的应用程序崩溃只是因为不让活动启用(在我工作的市场中,这是低端设备造成的常见情况)。
在我的应用程序中,我可以执行以下步骤:
ActivityA -> ActivityB -> ActivityC -> ActivityD (PdfViewer) -> PickActivity (I/ActivityTaskManager: START u0 {act=android.intent.action.CREATE_DOCUMENT cat=android.intent.category.OPENABLE typ=application/pdf
在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在分析日志时,我可以看到我的一项活动出现了两次。通过快速多次单击启动该活动的按钮,我成功地复制了该活动。然后我试着复制它。重新启动流,双击按钮,尝试保存PDF,在应用程序崩溃后,我可以看到FragmentManagerState崩溃。我只复制了一次。
1-由于我所有的崩溃都与BadParcelableException有关( FragmentManagerState和其他东西的),考虑到上面提到的,我在游戏商店看到的崩溃是否被标记为BadParcelableException,但与应用程序中的其他东西相关的崩溃,也触发了BadParcelableException崩溃、PlayStore和Firebase只显示了后面的那些?2-有什么建议可以改进,以正确记录在我的应用程序中的崩溃?
发布于 2021-01-31 18:43:17
对于您的第一个堆栈跟踪,这个问题是一年前报道的的,这个问题指的是FragmentManagerState。它似乎与一个特定于Android 10的bug有关。
对于InfoState崩溃,将对象作为byte[]放入包应该可以解决问题。但是,对于FragmentManagerState来说,这不是一个选项,因为在Jetpack中正在做更深入的工作。
您可能需要确认您在最新的androidx.fragment和androidx.activity库中,以防它们添加了解决方案。否则,您可能会查看有关该问题的评论,因为一些开发人员报告了一些解决方案,但它们非常具体,可能与您的场景相关,也可能与您的场景无关。
https://stackoverflow.com/questions/65981617
复制相似问题