在谷歌分析获取崩溃报告

我想收到关于崩溃报告的通知,因为我的Android应用程序的谷歌分析未捕获的exception。 我遵循https://developers.google.com/analytics/devguides/collection/android/v4/exceptions#parsing中给出的步骤,但仍然没有收到任何崩溃报告。 运行我的应用程序时,我有一个运行时exception。 我将ga_reportUncaughtException的代码添加为true:

真正

在我的analytics.xml中。 还有什么我需要添加为了得到击中谷歌分析帐户。 请帮忙!

Related of "在谷歌分析获取崩溃报告"

Google Analytics中存在一个公开问题。 我遇到了相同的行为,但在API 10到19的真实设备上。

https://code.google.com/p/analytics-issues/issues/detail?id=443

编辑1 :删除问题,只是为了回答所述的问题。

EDIT2:我试图使用Google Analytics(分析)ExceptionBuilder捕获和发送exception,但它不起作用。

它看起来像报告发送(至lessLogCat显示崩溃报告),但它不处理分析。

虽然谷歌回答了这个问题,我正在使用这个解决方法。 我想这不是最好的解决scheme,代码可以改进,但它适用于我:

  1. 我按照以下步骤在Google Analytics中创build了自定义维度:https://support.google.com/analytics/answer/2709829?hl = zh_CN

  2. 在我的应用程序中,我使用Analytics ExceptionReporter类创build了一个自定义exception处理程序。 当一个exception被捕获,我得到堆栈跟踪,并截断它到150字节(其实我只得到堆栈的第一行,并截断到150个字符,我假设1Char = 1字节)。 我必须将其截断,因为这是Google Analytics在发送自定义维度值时允许的最大长度。 堆栈跟踪存储在共享首选项中,而不是发送。 我试图直接发送,但一旦应用程序崩溃,它不起作用。

    package com.company.package; import java.lang.Thread.UncaughtExceptionHandler; import android.content.Context; import com.google.android.gms.analytics.ExceptionParser; import com.google.android.gms.analytics.ExceptionReporter; import com.google.android.gms.analytics.GoogleAnalytics; import com.google.android.gms.analytics.HitBuilders; import com.google.android.gms.analytics.Tracker; public class GoogleAnalyticsTracker { private static Tracker mTracker; private static GoogleAnalytics mGa; private Context mContext; public GoogleAnalyticsTracker(Context context, int resource) { mContext = context; mGa = GoogleAnalytics.getInstance(context); mTracker = getTracker(resource); Thread.setDefaultUncaughtExceptionHandler(new AnalyticsExceptionReporter(mTracker, Thread.getDefaultUncaughtExceptionHandler(), context)); } synchronized Tracker getTracker(int xmlResource) { return mGa.newTracker(xmlResource); } public void sendScreenLabel(String screenLabel) { mTracker.setScreenName(screenLabel); mTracker.send(new HitBuilders.AppViewBuilder().build()); } public void sendCustomDimension(int index, String value) { mTracker.send(new HitBuilders.AppViewBuilder().setCustomDimension(index, value).build()); } private class AnalyticsExceptionReporter extends ExceptionReporter { public AnalyticsExceptionReporter(Tracker tracker, UncaughtExceptionHandler originalHandler, Context context) { super(tracker, originalHandler, context); setExceptionParser(new AnalyticsExceptionParser()); } @Override public void uncaughtException(Thread t, Throwable e) { String exceptionDescription = getExceptionParser().getDescription(t.getName(), e); //Add code to store the exception stack trace in shared preferences super.uncaughtException(t, e); } } private class AnalyticsExceptionParser implements ExceptionParser { @Override public String getDescription(String arg0, Throwable arg1) { StringBuilder exceptionFirsLine = new StringBuilder(); for (StackTraceElement element : arg1.getStackTrace()) { exceptionFirsLine.append(element.toString()); break; } //150 Bytes is the maximum allowed by Analytics for custom dimensions values. Assumed that 1 Byte = 1 Character (UTF-8) String exceptionDescription = exceptionFirsLine.toString(); if(exceptionDescription.length() > 150) exceptionDescription = exceptionDescription.substring(0, 149); return exceptionDescription; } } } 
  3. 在OnStart()的MainActivity中,我检查是否存在共享首选项中存储的堆栈跟踪。 如果是这样,我发送自定义维度并清除共享首选项。

     @Override protected void onStart() { super.onStart(); String exception = getExceptionFromSharedPreferences(this); if(exception != null && !exception.isEmpty()) { MainApplication.googleAnalyticsTracker.sendCustomDimension(1, exception); } clearExceptionFromSharedPreferences(this); } 
  4. 最后,我在Google Analytics中创build了自定义报告

Google Analytics中的自定义报告配置

编辑3:

我意识到我只发送fileName和lineNumber,但不包括ExceptionName和我的包中的Exception的来源。 我通过添加代码来发送信息,从而改进了答案。

 private class AnalyticsExceptionParser implements ExceptionParser { @Override public String getDescription(String arg0, Throwable arg1) { String exceptionDescription = getExceptionInfo(arg1, "", true) + getCauseExceptionInfo(arg1.getCause()); //150 Bytes is the maximum allowed by Analytics for custom dimensions values. Assumed that 1 Byte = 1 Character (UTF-8) if(exceptionDescription.length() > 150) exceptionDescription = exceptionDescription.substring(0, 150); return exceptionDescription; } } //#endregion //#region PRIVATE METHODS private String getCauseExceptionInfo(Throwable t) { String causeDescription = ""; while(t != null && causeDescription.isEmpty()) { causeDescription = getExceptionInfo(t, "com.myPackageName", false); t = t.getCause(); } return causeDescription; } private String getExceptionInfo(Throwable t, String packageName, boolean includeExceptionName) { String exceptionName = ""; String fileName = ""; String lineNumber = ""; for (StackTraceElement element : t.getStackTrace()) { String className = element.getClassName().toString().toLowerCase(); if(packageName.isEmpty() || (!packageName.isEmpty() && className.contains(packageName))){ exceptionName = includeExceptionName ? t.toString() : ""; fileName = element.getFileName(); lineNumber = String.valueOf(element.getLineNumber()); return exceptionName + "@" + fileName + ":" + lineNumber; } } return ""; } 

根据我的经验,您需要了解Google Analytics中有关崩溃和exception的两件事情:

1)仅存储基本信息 – Google Analytics只会保存例外的名称以及引发例外的位置(代码文件和行号)。 GA以外的任何信息都无法获取。 这绝对是不理想的,如果您想跟踪例外(主要是调用堆栈)的实际内容,请使用Google Play或实施您自己的解决scheme。

2)例外情况不是实时的。 例外信息每天收集和更新一次,因此,如果您正在尝试使用例外情况,而您没有立即看到这些例外情况,只需花点时间。