使用 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
。