【发布时间】:2015-03-15 16:43:30
【问题描述】:
在 Java 或 Android 中记录未处理异常的堆栈跟踪时(例如通过 ACRA),您通常会以纯长字符串形式获取堆栈跟踪。
现在,所有提供崩溃报告和分析的服务(例如 Google Play 开发者控制台、Crashlytics)都将这些堆栈跟踪分组到唯一的存储桶中。这显然很有帮助 - 否则,您的列表中可能会有数以万计的崩溃报告,但其中只有十几个可能是独一无二的。
例子:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1027)
Caused by: java.lang.ArrayIndexOutOfBoundsException
at com.my.package.MyClass.i(SourceFile:1059)
...
上面的堆栈跟踪可能出现在多个变体中,例如由于平台版本不同,AsyncTask 等平台类可能会出现不同的行号。
为每个崩溃报告获取唯一标识符的最佳技术是什么?
清楚的是,对于您发布的每个新应用程序版本,崩溃报告都应单独处理,因为编译的源代码不同。在 ACRA 中,您可以考虑使用字段APP_VERSION_CODE。
但除此之外,您如何识别具有独特原因的报告?通过第一行和搜索自定义(非平台)类的第一次出现并查找文件和行号?
【问题讨论】:
-
好问题。如果你得到一个好的答案,我们可以将它折叠到 ACRA
-
@William 那太好了!您可以检查此处的任何答案或my library 是否适用于 ACRA。对我来说,没有一个答案是“开箱即用”的,但这些想法足以让我的库工作:
JavaCrashId.from(exception)加上应用程序版本代码似乎对我来说是一个崩溃指纹。
标签: java android stack-trace acra