我对crash tracking with Analytics感到有些困惑。 AFIK只能存储在不再超过200字节(每个属性)的Analytics字符串中。因此,不可能看到完整的堆栈跟踪,因为它们通常比200个字符长。
然而,使用Analytics v2 API,可以使用EasyTracker,described here。还有一些半复制使用ga_reportUncaughtExceptions
属性,例如:Google Analytics crash report only shows first line of stack trace或Exception stack trace lost in Google Analytics v2 for Android?
由于我使用Tag-Manager,我无法使用这些解决方案,我已经弄清楚如何使用Tag-Manager正确跟踪前200字节的崩溃,但是完整的堆栈跟踪是什么?
我还使用ACRA为用户提供直接联系我们的方式(将堆栈跟踪作为附件),这样就可以停止与Google崩溃记者的直接连接,并且Google Play控制台不显示崩溃。
答案 0 :(得分:4)
可以在Google Analytics v4中针对Android中所有未捕获的异常发送完整堆栈跟踪。
在应用程序类中将自动活动跟踪设置为true。
// Enable automatic activity tracking for your app
tracker.enableAutoActivityTracking(true);
进一步覆盖 StandardExceptionParser 类的 getDescription 方法。 Throwable 包含堆栈跟踪元素的数组,如果转换为字符串格式,则将成为您在日志中看到的堆栈跟踪。
public class AnalyticsExceptionParser extends StandardExceptionParser {
public AnalyticsExceptionParser(Context context, Collection<String> additionalPackages) {
super(context, additionalPackages);
}
@Override
protected String getDescription(Throwable cause,
StackTraceElement element, String threadName) {
StringBuilder descriptionBuilder = new StringBuilder();
final Writer writer = new StringWriter();
final PrintWriter printWriter = new PrintWriter(writer);
cause.printStackTrace(printWriter);
descriptionBuilder.append(writer.toString());
printWriter.close();
return descriptionBuilder.toString();
}
}
最后,将 AnalyticsExceptionParser 提供给 ExceptionReporter 的实例。
public class MyApplication extends Application {
@Override
public void onCreate() {
...
ExceptionReporter reporter = new ExceptionReporter(getTracker(), Thread.getDefaultUncaughtExceptionHandler(), this);
reporter.setExceptionParser(new AnalyticsExceptionParser(this, packages));
Thread.setDefaultUncaughtExceptionHandler(reporter);
}
}
多数民众赞成。在行为&gt;中查看GA控制台上的崩溃报告崩溃和例外。
答案 1 :(得分:2)
您可以覆盖主线程使用的ExceptionParser
来调整它以报告完整的堆栈跟踪:
final Thread.UncaughtExceptionHandler uncaughtExceptionHandler =
Thread.getDefaultUncaughtExceptionHandler();
if (uncaughtExceptionHandler instanceof ExceptionReporter) {
ExceptionReporter exceptionReporter = (ExceptionReporter) uncaughtExceptionHandler;
exceptionReporter.setExceptionParser(new ExceptionParser() {
@Override
public String getDescription(String s, Throwable throwable) {
return "Thread: " + s + ", Stacktrace: " + ExceptionUtils.getStackTrace(throwable);
}
});
}
将其放在实例化Google Analytics实例的位置。我使用的ExceptionUtils
类来自apache的common-lang3库。