崩溃和异常

本文档将大略介绍如何使用 Android 版 Google Analytics(分析)SDK v4 对崩溃和异常进行衡量。

概览

崩溃和异常衡量功能可帮助您衡量您的应用中发生的已捕获和未捕获的崩溃和异常的次数及类型。异常数据包含以下字段:

字段名称 类型 是否必需 说明
Description String 异常的相关说明(最多 100 个字符)。null 是可接受的值。
isFatal boolean 表示异常是否严重。 true 代表严重。

崩溃和异常数据主要在“崩溃和异常”报告中提供。

捕获的异常

捕获的异常(例如在请求数据的过程中偶然出现网络连接超时)是您已经实现代码进行处理的应用中的错误。

为了对捕获的异常进行衡量,您应当在跟踪器上设置异常字段值并发送匹配,如下例所示:

// Get tracker.
Tracker t =
    ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(TrackerName.APP_TRACKER);

// Build and send exception.
t.send(new HitBuilders.ExceptionBuilder()
    .setDescription(getExceptionMethod() + ":" + getExceptionLocation())
    .setFatal(getExceptionFatal())
    .build());

请参见高级配置,详细了解 getTracker 方法。

衡量未捕获的异常

未捕获的异常表示您的应用在运行时遇到的意外错误,此类异常通常是严重的,会导致应用崩溃。要自动向 Google Analytics(分析)发送未捕获的异常,请设置 ga_reportUncaughtExceptions 配置值,或使用 ExceptionReporter 类。

自动配置

要将应用中所有未捕获的异常自动发送到 Google Analytics(分析),请在您的 XML 配置文件中添加此行内容:

<bool name="ga_reportUncaughtExceptions">true</bool>

在使用自动异常衡量功能发送异常之后,此次异常的数据将会被传递到 Thread 的默认异常处理程序。

使用高级实现

如果您使用了高级实现方案,而且未使用 ga_reportUncaughtExceptions 配置值,则请使用 ExceptionReporter 类来实现自动未捕获异常衡量功能。

ExceptionReporter 可以作为您的应用中某个线程或所有线程的默认未捕获异常处理程序。在向 Google Analytics(分析)发送异常后,ExceptionReporter 类可以选择将异常传递到您提供的某个未捕获异常处理程序。

以下代码会创建一个新的 ExceptionReporter 对象,并将其设置为新的默认未捕获异常处理程序。结果,每个未捕获异常都会先被发送到 Google Analytics(分析),然后被传递到该未捕获异常处理程序。对于大多数应用,默认处理程序会将异常记录到日志中,然后终止应用。

Thread.UncaughtExceptionHandler myHandler = new ExceptionReporter(
    myTracker,
    Thread.getDefaultUncaughtExceptionHandler(),
    context);

// Make myHandler the new default uncaught exception handler.
Thread.setDefaultUncaughtExceptionHandler(myHandler);

在使用自动异常衡量功能时,请注意以下事项:

  • 所有使用自动异常衡量功能发送的异常都会在 Google Analytics(分析)中显示为严重异常。
  • 默认情况下,说明字段会自动填充以下信息:异常类型、类名称、方法名称和线程名称。

解析异常说明

SDK 提供的 StandardExceptionParser 可简化获取并向 Google Analytics(分析)发送异常说明的流程:

// Get tracker.
Tracker t = ((AnalyticsSampleApp) getActivity().getApplication()).getTracker(
    TrackerName.APP_TRACKER);

// Using StandardExceptionParser to get an Exception description.
try {
    // Request some scores from the network.
    ArrayList<Integer> highScores = getHighScoresFromCloud();
} catch (IOException e) {
    t.send(new HitBuilders.ExceptionBuilder()
        .setDescription(new StandardExceptionParser(this, null)
            .getDescription(Thread.currentThread().getName(), e))
        .setFatal(false)
        .build()
    );

    ... // Display alert to user that high scores are currently unavailable.
}

您也可以实现自己的解析器,方法是实现 ExceptionParser 接口并在向 Google Analytics(分析)发送异常时调用该接口的 setDescription 方法。