崩溃报告

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

此页面记录了崩溃报告的类型、各个部分如何交互以及发送回 Mozilla 的数据类型。

特定库的文档包含在 Android Components 崩溃报告自述文件 中。

Glean 崩溃 Ping

Glean SDK 是一个 Mozilla 开源遥测库,Firefox for Android 使用它来收集应用程序遥测数据。它还可以收集崩溃计数作为带标签的计数器,每个标签对应于特定类型的崩溃(例如 native_code_crashunhandled_exception)。

Glean 崩溃 Ping 格式记录在 此处

要选择加入或退出 Glean 遥测报告,请访问设置下的数据收集菜单。

Socorro

Socorro 是一个 Mozilla 开源项目,用于 崩溃统计。Firefox for Android 使用 Socorro 来跟踪原生 GeckoView 崩溃。崩溃报告包含签名、分类和许多改进的字段(例如操作系统、产品、版本) - 您可以在 Socorro 报告文档 中阅读有关这些字段中发送的内容的更多信息。

这些崩溃包含硬件信息和一些应用程序元数据,但在报告中看不到任何个人身份信息。一些隐私敏感的部分仅对拥有“小型转储访问权限”的用户可用,这些用户数量相对较少,并且必须遵循特定的规则。

可以在 此处 找到 Firefox for Android 崩溃报告示例。

只有当用户通过崩溃报告通知或对话框确认并提交崩溃报告时,才会发送崩溃报告。崩溃报告永远不会自动发送。

Sentry

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

只有当用户通过崩溃报告通知或对话框确认并提交崩溃报告时,才会发送崩溃报告。崩溃报告永远不会自动发送。

高级摘要

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

在客户端,Sentry 是不可见的。没有可以交互的部分。它在后台将崩溃和致命错误报告回 Mozilla。

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

Sentry 报告

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

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

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

设备信息

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

"contexts": {
    "device": {
        "screen_resolution":"1920x1080",
        "battery_level":44.0,
        "orientation":"portrait",
        "family":"ONEPLUS",
        "model_id":"PQ3A.190705.003",
        "type":"device",
        "low_memory":false,
        "simulator":false,
        "free_storage":21314179072,
        "storage_size":56416321536,
        "screen_dpi":420,
        "free_memory":2506031104,
        "memory_size":6005846016,
        "online":true,
        "charging":false,
        "model":"ONEPLUS A5000",
        "screen_density":2.625,
        "arch":"arm64-v8a",
        "brand":"OnePlus",
        "manufacturer":"OnePlus"
    },
// ...
    "os":{
        "rooted":true,
        "kernel_version":"4.4.184-sigmaKernel-v11.0",
        "version":"9",
        "build":"PQ3A.190705.003",
        "type":"os",
        "name":"Android"
    }
}

应用程序信息

Sentry 收集有关 Firefox for Android 应用程序的基本信息。

    "app":{
        "app_identifier":"org.mozilla.fenix",
        "app_name":"Firefox Preview",
        "app_start_time":"2019-09-23T21:00:05Z",
        "app_version":"1.4.1",
        "type":"app",
        "app_build":12531634
    },
    "sdk":{
        "version":"1.7.10-598d4",
        "name":"sentry-java"
    }

崩溃信息

堆栈跟踪

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

  "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 的 Firefox for Android 团队、Android 框架、Java 编程语言以及 Mozilla 捆绑用于开发 Firefox for Android 的任何库。

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

以下是 Java 生成的示例消息

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

Firefox for Android 生成的消息示例

java.lang.StringIndexOutOfBoundsException: Cannot create negative-length String
原始数据转储

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