使用 Sentry 进行崩溃报告

如果本文档中的任何内容不清楚、不正确或需要更多详细信息,请通过 Github 提交请求。

Focus Android 使用 Sentry 进行崩溃和异常报告。这种类型的报告为 Mozilla 提供了宝贵的见解,了解 Focus 崩溃或行为异常的原因。它是我们用于提高产品稳定性的关键方法之一。

此页面解释了 Sentry 的工作原理、各个部分如何交互以及它向 Mozilla 发送的数据类型。

高级概述

Sentry 是一个开源的崩溃报告和聚合平台。客户端 SDK,github.com/getsentry/sentry-java,和服务器,github.com/getsentry/sentry,都是开源的。

服务器由 Mozilla 托管和维护。不涉及任何第三方,所有崩溃报告都直接从 Focus Android 发送到 Mozilla 托管的 Sentry 服务器。

在客户端,Sentry 是不可见的。没有可交互的部分。它在后台将崩溃和致命错误报告回 Mozilla。当用户在 Focus 设置中启用“发送使用数据”开关时,Sentry 会启用。默认情况下,Focus 中此开关处于启用状态,并采用“选择退出”机制。在 Klar 中,默认情况下此开关处于禁用状态,并采用“选择加入”机制。

在服务器端,有一个仪表板供 Focus 团队查看传入的崩溃报告。该仪表板允许我们详细检查崩溃报告,例如查看应用程序中崩溃发生的位置、使用了哪个版本的应用程序以及哪个版本的 Android 操作系统处于活动状态。以下是崩溃报告中所有属性的概述。

Sentry 报告

典型的 Sentry 崩溃报告包含三类数据:设备、应用程序、崩溃。它还包含一些关于崩溃报告的元数据

 "id": "6ae18611d6c649529a5eda0e48f42cb4",
// ...
 "datetime": "2018-03-30T23:55:03.000000Z",
// ...
 "received": 1522454183.0,

澄清一下,id 是此崩溃报告的唯一标识符,*而不是发送报告用户的唯一标识符*。我们明确禁用从其崩溃报告中唯一识别用户的功能。

设备信息

Sentry 收集有关应用程序正在运行的设备的基本信息。包括静态信息(设备类型)和动态信息(内存使用情况、设备方向)。

"contexts": {
    "device": {
      "screen_resolution": "1920x1080",
      "battery_level": 100.0,
      "orientation": "landscape",
      "family": "AFTN",
      "model_id": "NS6212",
      "type": "device",
      "low_memory": false,
      "simulator": false,
      "free_storage": 3967590400,
      "storage_size": 5735825408,
      "screen_dpi": 320,
      "free_memory": 543588352,
      "memory_size": 1392164864,
      "online": true,
      "charging": true,
      "model": "AFTN",
      "screen_density": 2.0,
      "arch": "armeabi-v7a",
      "brand": "Amazon",
      "manufacturer": "Amazon"
    },
// ...
    "os": {
      "rooted": false,
      "kernel_version": "Linux version 3.14.29 (build@14-use1b-b-42) (gcc version 4.9.2 20140904 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.09 - Linaro GCC 4.9-2014.09) ) #1 SMP PREEMPT Fri Jan 19 00:36:45 UTC 2018",
      "version": "7.1.2",
      "build": "NS6212",
      "type": "os",
      "name": "Android"
    }
},

应用程序信息

Sentry 收集有关 Focus 应用程序的基本信息。

    "app": {
      "app_identifier": "org.mozilla.focus",
      "app_name": "Focus",
      "app_start_time": "2018-03-30T16:55:03Z",
      "app_version": "2.1",
      "type": "app",
      "app_build": 11
// ...
  "sdk": {
    "client_ip": "63.245.222.193",
    "version": "1.7.2-02be9",
    "name": "sentry-java"

崩溃信息

堆栈跟踪

每个崩溃报告都包含一个堆栈跟踪,它显示了 Focus 代码中的哪些函数导致了此崩溃。它包括 Android 框架函数和 Focus 函数的名称。以下是堆栈跟踪中三行的摘录

  "sentry.interfaces.Exception": {
    "exc_omitted": null,
    "values": [
      {
        "stacktrace": {
          "frames": [
            {
              "function": "main",
              "abs_path": "ZygoteInit.java",
              "module": "com.android.internal.os.ZygoteInit",
              "in_app": false,
              "lineno": 801,
              "filename": "ZygoteInit.java"
            },
            {
              "function": "run",
              "abs_path": "ZygoteInit.java",
              "module": "com.android.internal.os.ZygoteInit$MethodAndArgsCaller",
              "in_app": false,
              "lineno": 911,
              "filename": "ZygoteInit.java"
            },
            {
              "function": "invoke",
              "abs_path": "Method.java",
              "in_app": false,
              "module": "java.lang.reflect.Method",
              "filename": "Method.java"
},

异常消息

每个崩溃报告中每个堆栈跟踪的第一行都包含一个原因 - 为什么发生此崩溃。此原因由编写代码以确定应用程序处于错误状态的开发者提供。这些开发者包括 Mozilla 的 Focus 团队、Android 框架、Java 编程语言以及 Mozilla 为开发 Focus 而捆绑的任何库。

Java、Android 框架和 Mozilla 非常重视确保这些消息中不包含任何个人身份信息。我们使它们保持技术性和重点突出。我们 Mozilla 会密切关注我们的依赖项,以确保它们也不包含个人身份信息。

以下是由 Java 生成的示例消息

java.lang.StringIndexOutOfBoundsException: length=0; regionStart=20; regionLength=20

Focus 生成的消息示例

java.lang.StringIndexOutOfBoundsException: Cannot create negative-length String

原始数据转储

在以上说明中,出于简洁起见,省略了一些冗余字段和被认为不太重要的字段。要查看这些省略内容,这是服务器接收的原始数据的示例。截至 2018 年 3 月 30 日,此数据是最新的。

面向开发者

有关开发者文档,例如如何在构建中启用 Sentry,请参阅代码库中的 SentryWrapper.kt