将 Firebase Crashlytics 数据导出到 BigQuery

您可以将 Firebase Crashlytics 数据导出到 BigQuery 以便进一步分析。借助 BigQuery,您可以使用 BigQuery SQL 来分析数据,将数据导出至其他云提供商,并搭配 Google 数据洞察将数据用于实现可视化和自定义信息中心。

启用导出到 BigQuery

  1. Firebase 控制台中,前往集成页面

  2. BigQuery 卡片中,点击关联

  3. 按照屏幕上的说明启用导出到 BigQuery 的功能。

    如果您希望近乎实时地访问 BigQuery 中的 Crashlytics 数据,请考虑升级到流式导出

启用导出功能后会发生什么?

  • 您选择数据集位置。创建数据集后,将无法更改其位置,但可以将数据集复制到其他位置,或手动将数据集移动(重新创建)到其他位置。如需了解详情,请参阅更改现有导出的位置

    此位置仅适用于导出到 BigQuery 中的数据,它不会影响存储在 Firebase 控制台的 Crashlytics 信息中心或 Android Studio 中使用的数据的位置。

  • 默认情况下,您项目中的所有应用都会关联到 BigQuery,而且您以后向项目中添加的所有应用也都会自动关联到 BigQuery。您可以管理哪些应用可发送数据

  • Firebase 会安排每日将您的数据同步到 BigQuery

    • 关联项目后,您通常需要等到第二天的同步,才能将第一组数据导出到 BigQuery

    • 无论您在 BigQuery 中是否设置了任何定期导出,每天都会进行一次每日同步。请注意,同步作业的时间和时长可能会发生变化,因此我们不建议您根据特定的导出时间安排下游操作或作业。

  • Firebase 会将您的现有数据的副本导出BigQuery。导出数据的初始传播最长可能需要 48 小时。

    • 对于每个关联应用,此导出都包括一个批处理表,其中包含每日同步的数据。

    • 对于过去长达 30 天的时间里或您启用导出到 BigQuery 功能后的最近日期中产生的批处理表(以最新的为准),您可以手动安排数据回填

    请注意,如果您在 2024 年 10 月中旬之前启用了 Crashlytics 数据导出功能,则还可以回填到您启用导出功能之前的 30 天。

  • 如果启用 Crashlytics BigQuery 流式导出功能,则所有关联的应用也都将具有一个包含持续更新数据的实时表。

如需停用导出到 BigQuery,请在 Firebase 控制台中解除与您的项目的关联

哪些数据会导出到 BigQuery

Firebase Crashlytics 数据会导出到名为 firebase_crashlyticsBigQuery 数据集。默认情况下,系统将在 Crashlytics 数据集内为项目中的每个应用分别创建表。Firebase 会根据应用的标识符为这些表命名:将英文句点转换为下划线,并在末尾处附加平台名称。

例如,软件包名称为 com.google.test 的 Android 应用的数据会存储在名为 com_google_test_ANDROID 的表中。此批处理表每天更新一次。如果您启用 Crashlytics BigQuery 流式导出,则 Crashlytics 数据也将实时流式传输到名为 com_google_test_ANDROID_REALTIME 的表中。

表中的每一行均表示应用中发生的事件,包括崩溃、非严重错误和 ANR。

Crashlytics 流式导出到 BigQuery

您可以使用 BigQuery 流式传输实时流式传输 Crashlytics 数据。您可以将其用于任何需要实时数据的用途,例如在实时信息中心内展示信息、实时观察发布情况,或者监控触发提醒和自定义工作流的应用问题。

启用 Crashlytics BigQuery 流式导出后,除了批处理表之外,您还会获得一个实时表。您应该了解,这两种表之间有如下区别:

批处理表 实时表
  • 每天导出一次数据。
  • 在将数据批量写入 BigQuery 之前持久存储事件。
  • 最多可回填 30 天前的数据*。
  • 数据会实时导出。
  • 不提供数据回填。

批处理表非常适合用于长期分析以及识别随时间推移而变化的趋势,因为我们在写入事件之前会先将事件数据持久存储,而且最多可在表中回填 30 天前的事件数据*。在将数据写入实时表时,我们会立即将其写入 BigQuery,因此这种表非常适合用于实时信息中心和自定义提醒。您可以使用拼接查询将这两种表结合使用,从而同时获享两者的优势。

默认情况下,实时表的分区过期时间为 30 天。如需了解如何修改此设置,请参阅 BigQuery 文档中的设置分区过期时间

* 如需详细了解回填支持,请参阅升级到新的导出基础设施

启用 Crashlytics BigQuery 流式导出

  1. Firebase 控制台中,前往集成页面

  2. BigQuery 卡片中,点击管理

  3. 选中包含流式传输复选框。

此操作会为您的所有关联应用启用流式传输。

您可以对导出的数据执行哪些操作?

BigQuery 导出的数据包含原始崩溃数据,其中包括设备类型、操作系统、异常(Android 应用)或错误(Apple 应用)和 Crashlytics 日志,以及其他数据。

请在本页后面部分查看系统导出的 Crashlytics 数据以及其表架构

使用数据洞察模板

如需在数据洞察模板中启用实时数据,请按照使用数据洞察直观呈现导出的 Crashlytics 数据中的说明操作。

创建视图

您可以使用 BigQuery 界面将查询转换为视图。如需查看详细说明,请参阅 BigQuery 文档中的创建视图

运行查询

以下示例演示了您可以对 Crashlytics 数据运行的查询,以生成报告,将崩溃事件数据汇总到更易理解的摘要中。由于 Firebase 控制台的 Crashlytics 信息中心内不提供这类报告,因此这些报告可以补充您对崩溃数据的分析和理解。

示例 1:每天的崩溃次数

在努力解决尽可能多的 bug 之后,您认为自己的团队终于做好了准备,可以推出全新的照片共享应用。在推出之前,您想检查一下过去一个月内每天的崩溃次数,以确保这次大规模的纠错让应用的运行更加稳定了。

以下是 Android 应用的示例查询。对于 iOS 应用,请使用其软件包 ID 和 IOS(而不是软件包名称和 ANDROID)。

SELECT
  COUNT(DISTINCT event_id) AS number_of_crashes,
  FORMAT_TIMESTAMP("%F", event_timestamp) AS date_of_crashes
FROM
 `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
GROUP BY
  date_of_crashes
ORDER BY
  date_of_crashes DESC
LIMIT 30;

示例 2:查找最普遍的崩溃

为了适当排定生产计划的优先级,您需要找出应用中 10 个最普遍的崩溃。您可以生成一个查询,以提供相关数据。

以下是 Android 应用的示例查询。对于 iOS 应用,请使用其软件包 ID 和 IOS(而不是软件包名称和 ANDROID)。

SELECT
  DISTINCT issue_id,
  COUNT(DISTINCT event_id) AS number_of_crashes,
  COUNT(DISTINCT installation_uuid) AS number_of_impacted_user,
  blame_frame.file,
  blame_frame.line
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(),INTERVAL 168 HOUR)
  AND event_timestamp < CURRENT_TIMESTAMP()
GROUP BY
  issue_id,
  blame_frame.file,
  blame_frame.line
ORDER BY
  number_of_crashes DESC
LIMIT 10;

示例 3:10 大易崩溃设备

秋季是新手机的发布季!贵公司知道,这也意味着又到了解决新设备特有的问题的季节,尤其是 Android 设备。为了针对很可能出现的兼容性问题而未雨绸缪,您编写了一个查询,可以识别过去一周(168 小时)里出现最多崩溃的 10 款设备。

以下是 Android 应用的示例查询。对于 iOS 应用,请使用其软件包 ID 和 IOS(而不是软件包名称和 ANDROID)。

SELECT
  device.model,
COUNT(DISTINCT event_id) AS number_of_crashes
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 168 HOUR)
  AND event_timestamp < CURRENT_TIMESTAMP()
GROUP BY
  device.model
ORDER BY
  number_of_crashes DESC
LIMIT 10;

示例 4:按自定义键过滤

您是游戏开发者,想知道游戏崩溃次数最频繁的是哪个关卡。

为了跟踪该统计信息,您可以设置一个名为 current_level自定义 Crashlytics,并在用户每次进入新的关卡时更新该键。

Swift

Crashlytics.sharedInstance().setIntValue(3, forKey: "current_level");

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Java

Crashlytics.setInt("current_level", 3);

在导出到 BigQuery 的数据中使用该键,您可以编写一个查询来报告与各个崩溃事件相关联的 current_level 值的分布情况。

以下是 Android 应用的示例查询。对于 iOS 应用,请使用其软件包 ID 和 IOS(而不是软件包名称和 ANDROID)。

SELECT
COUNT(DISTINCT event_id) AS num_of_crashes,
  value
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
UNNEST(custom_keys)
WHERE
  key = "current_level"
GROUP BY
  key,
  value
ORDER BY
  num_of_crashes DESC

示例 5:用户 ID 提取

您有一个处于抢先体验阶段的 Android 应用。该应用的大多数用户都很喜欢它,但有三位用户遇到了异常数量的崩溃。为了确定该问题的根源,您编写了一个查询,按照用户 ID 拉取这些用户的所有崩溃事件。

以下是 Android 应用的示例查询。对于 iOS 应用,请使用其软件包 ID 和 IOS(而不是软件包名称和 ANDROID)。

SELECT *
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  user.id IN ("USER_ID_1", "USER_ID_2", "USER_ID_3")
ORDER BY
  user.id
 

示例 6:查找面临特定崩溃问题的所有用户

您的团队向一组 Beta 版测试人员发布的版本中包含一个严重 bug。您的团队可以使用上面“查找最普遍的崩溃”示例中的查询来识别这一特定崩溃问题的 ID。现在,您的团队想要运行查询来提取受此崩溃影响的应用用户列表。

以下是 Android 应用的示例查询。对于 iOS 应用,请使用其软件包 ID 和 IOS(而不是软件包名称和 ANDROID)。

SELECT user.id as user_id
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  issue_id = "ISSUE_ID"
  AND application.display_version = "APP_VERSION"
  AND user.id != ""
ORDER BY
  user.id;

示例 7:受崩溃问题影响的用户数量,按国家/地区细分

您的团队在发布新版本期间发现了一个严重 bug。您可以使用上面“查找最普遍的崩溃”示例中的查询来识别特定崩溃问题的 ID。您的团队现在想要确认该崩溃是否已蔓延至全球不同国家/地区的用户。

为了编写此查询,您的团队将需要执行以下操作:

  1. 启用将 Google Analytics 数据导出到 BigQuery 的功能。请参阅将项目数据导出到 BigQuery

  2. 更新应用以将用户 ID 传递到 Google Analytics SDK 和 Crashlytics SDK。

    Swift

    Crashlytics.sharedInstance().setUserIdentifier("123456789");
    Analytics.setUserID("123456789");
    

    Objective-C

    CrashlyticsKit setUserIdentifier:@"123456789";
    FIRAnalytics setUserID:@"12345678 9";
    

    Java

    Crashlytics.setUserIdentifier("123456789");
    mFirebaseAnalytics.setUserId("123456789");
    
  3. 编写一个查询,通过用户 ID 字段将 Google Analytics 数据集中的事件与 Crashlytics 数据集中的崩溃联接:

    以下是 Android 应用的示例查询。对于 iOS 应用,请使用其软件包 ID 和 IOS(而不是软件包名称和 ANDROID)。

    SELECT DISTINCT c.issue_id, a.geo.country, COUNT(DISTINCT c.user.id) as num_users_impacted
    FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` c
    INNER JOIN  `PROJECT_ID.analytics_TABLE_NAME.events_*` a on c.user.id = a.user_id
    WHERE
      c.issue_id = "ISSUE_ID"
      AND a._TABLE_SUFFIX BETWEEN '20190101'
      AND '20200101'
    GROUP BY
      c.issue_id,
      a.geo.country,
      c.user.id
    

示例 8:今天到现在为止的 5 大问题

以下是 Android 应用的示例查询。对于 iOS 应用,请使用其软件包 ID 和 IOS(而不是软件包名称和 ANDROID)。

SELECT
  issue_id,
  COUNT(DISTINCT event_id) AS events
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID_REALTIME`
WHERE
  DATE(event_timestamp) = CURRENT_DATE()
GROUP BY
  issue_id
ORDER BY
  events DESC
LIMIT
  5;

示例 9:自 DATE 起至今(包括今天)的 5 大问题

您还可以将批量表和实时表与拼接查询结合使用,以便将实时信息添加到可靠的批量数据中。由于 event_id 是主键,因此您可以使用 DISTINCT event_id 对两个表中的任何常见事件进行重复数据删除。

以下是 Android 应用的示例查询。对于 iOS 应用,请使用其软件包 ID 和 IOS(而不是软件包名称和 ANDROID)。

SELECT
  issue_id,
  COUNT(DISTINCT event_id) AS events
FROM (
  SELECT
    issue_id,
    event_id,
    event_timestamp
  FROM
    `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID_REALTIME`
  UNION ALL
  SELECT
    issue_id,
    event_id,
    event_timestamp
  FROM
    `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`)
WHERE
  event_timestamp >= "YYYY_MM_DD"
GROUP BY
  issue_id
ORDER BY
  events DESC
LIMIT
  5;

了解 BigQuery 中的 Crashlytics 架构

Crashlytics 数据导出到 BigQuery 时,Firebase 会导出最近的事件(崩溃、非严重错误和 ANR),包括关联前两天发生的事件,并提供回填选项(最多可回填 30 天前的数据)。

从关联起直至您停用该关联,Firebase 每天都会导出 Crashlytics 事件。每次导出后,可能需要几分钟时间才能在 BigQuery 中找到这些数据。

数据集

Crashlytics 会在 BigQuery 中为 Crashlytics 数据创建新数据集。该数据集会涵盖您的整个项目(即使它有多个应用)。

除非您选择停止导出应用数据,否则 Crashlytics 会在数据集中为项目的每个应用创建一个表。Firebase 会根据应用的标识符为这些表命名:将英文句点转换为下划线,并在末尾处附加平台名称。

例如,软件包名称为 com.google.test 的 Android 应用的数据会存储在名为 com_google_test_ANDROID 的表中,而实时数据(如果已启用)会存储在名为 com_google_test_ANDROID_REALTIME 的表中

除了您在应用中定义的任何自定义 Crashlytics之外,表还包含一组标准的 Crashlytics 数据。

表中的每一行都表示应用遇到的一个错误。

对于崩溃、非严重错误和 ANR,表中的列完全相同。如果启用了 Crashlytics BigQuery 流式导出,则实时表中的列与批处理表中的列相同。请注意,行中可能存在表示无堆栈轨迹的事件的列。

导出数据中的列列在下表中:

字段名称 数据类型 说明
platform STRING 在 Firebase 项目中注册的应用平台(有效值:IOSANDROID
bundle_identifier STRING 在 Firebase 项目中注册的应用的唯一标识符(例如 com.google.gmail
对于 Apple 平台应用,这是应用的软件包 ID。
对于 Android 应用,这是应用的软件包名称。
event_id STRING 事件的唯一 ID
is_fatal BOOLEAN 应用是否崩溃
error_type STRING 事件的错误类型(例如 FATALNON_FATALANR 等)
issue_id STRING 与事件相关的问题
variant_id STRING 与此事件相关的问题变体
请注意,并非所有事件都有关联的问题变体。
event_timestamp TIMESTAMP 事件发生的时间
device RECORD 发生事件的设备
device.manufacturer STRING 设备制造商
device.model STRING 设备型号
device.architecture STRING 例如 X86_32X86_64ARMV7ARM64ARMV7SARMV7K
memory RECORD 设备的内存状态
memory.used INT64 使用的内存字节数
memory.free INT64 剩余的内存字节数
storage RECORD 设备的永久性存储空间
storage.used INT64 使用的存储空间字节数
storage.free INT64 剩余的存储空间字节数
operating_system RECORD 设备上的操作系统的详细信息
operating_system.display_version STRING 设备上的操作系统的版本
operating_system.name STRING 设备上的操作系统的名称
operating_system.modification_state STRING 设备是否已经过修改(例如,越狱应用为 MODIFIED,而已启用 root 权限的应用为 UNMODIFIED
operating_system.type STRING (仅限 Apple 应用)设备上运行的操作系统类型(例如 IOSMACOS 等)
operating_system.device_type STRING 设备的类型(例如 MOBILETABLETTV 等);也称为“设备类别”
application RECORD 引发事件的应用
application.build_version STRING 应用的版本号
application.display_version STRING
user RECORD (可选)收集的应用用户信息
user.name STRING (可选)用户的姓名
user.email STRING (可选)用户的电子邮件地址
user.id STRING (可选)与用户关联的特定应用的 ID
custom_keys REPEATED RECORD 开发者定义的键值对
custom_keys.key STRING 开发者定义的密钥
custom_keys.value STRING 开发者定义的值
installation_uuid STRING 标识唯一应用和设备安装的 ID
crashlytics_sdk_versions STRING 生成事件的 Crashlytics SDK 版本
app_orientation STRING 例如,PORTRAITLANDSCAPEFACE_UPFACE_DOWN 等。
device_orientation STRING 例如,PORTRAITLANDSCAPEFACE_UPFACE_DOWN 等。
process_state STRING BACKGROUNDFOREGROUND
logs REPEATED RECORD Crashlytics 日志记录器生成的带时间戳的日志消息(如果已启用)
logs.timestamp TIMESTAMP 日志创建时间
logs.message STRING 记录的消息
breadcrumbs REPEATED RECORD 带有时间戳的 Google Analytics 路径(如果已启用)
breadcrumbs.timestamp TIMESTAMP 与路径关联的时间戳
breadcrumbs.name STRING 与路径关联的名称
breadcrumbs.params REPEATED RECORD 与路径关联的参数
breadcrumbs.params.key STRING 与路径关联的参数键
breadcrumbs.params.value STRING 与路径关联的参数值
blame_frame RECORD 被确定为崩溃或错误根本原因的帧
blame_frame.line INT64 帧文件的行号
blame_frame.file STRING 帧文件的名称
blame_frame.symbol STRING 水化合符号,或原始符号(如果无法水化合)
blame_frame.offset INT64 包含代码的二进制图片中的字节偏移量
Java 异常未设置
blame_frame.address INT64 包含代码的二进制图片中的地址
Java 帧未设置
blame_frame.library STRING 包含帧的库的显示名
blame_frame.owner STRING 例如 DEVELOPERVENDORRUNTIMEPLATFORMSYSTEM
blame_frame.blamed BOOLEAN Crashlytics 是否已确定此帧是导致崩溃或错误的原因
exceptions REPEATED RECORD (仅适用于 Android)此事件期间发生的异常。嵌套异常以反向时间顺序呈现,这意味着最后一条记录是抛出的第一个异常
exceptions.type STRING 异常类型(例如 java.lang.IllegalStateException)
exceptions.exception_message STRING 与异常关联的消息
exceptions.nested BOOLEAN 对于除最后抛出的异常(即第一条记录)之外的所有异常都为 true
exceptions.title STRING 线程的标题
exceptions.subtitle STRING 线程的副标题
exceptions.blamed BOOLEAN 如果 Crashlytics 确定异常导致错误或崩溃,则为 true
exceptions.frames REPEATED RECORD 与异常关联的帧
exceptions.frames.line INT64 帧文件的行号
exceptions.frames.file STRING 帧文件的名称
exceptions.frames.symbol STRING 水化合符号,或原始符号(如果无法水化合)
exceptions.frames.offset INT64 包含代码的二进制图片中的字节偏移量
Java 异常未设置
exceptions.frames.address INT64 包含代码的二进制图片中的地址
Java 帧未设置
exceptions.frames.library STRING 包含帧的库的显示名
exceptions.frames.owner STRING 例如 DEVELOPERVENDORRUNTIMEPLATFORMSYSTEM
exceptions.frames.blamed BOOLEAN Crashlytics 是否已确定此帧是导致崩溃或错误的原因
error REPEATED RECORD (仅限 Apple 应用)非严重错误
error.queue_name STRING 线程正在运行的队列
error.code INT64 与应用自定义记录的 NSError 关联的错误代码
error.title STRING 线程的标题
error.subtitle STRING 线程的副标题
error.blamed BOOLEAN Crashlytics 是否已确定此帧是导致错误的原因
error.frames REPEATED RECORD 堆栈轨迹的帧
error.frames.line INT64 帧文件的行号
error.frames.file STRING 帧文件的名称
error.frames.symbol STRING 水化合符号,或原始符号(如果无法水化合)
error.frames.offset INT64 包含代码的二进制图片中的字节偏移量
error.frames.address INT64 包含代码的二进制图片中的地址
error.frames.library STRING 包含帧的库的显示名
error.frames.owner STRING 例如 DEVELOPERVENDORRUNTIMEPLATFORMSYSTEM
error.frames.blamed BOOLEAN Crashlytics 是否已确定此帧是导致错误的原因
threads REPEATED RECORD 事件发生时显示的线程
threads.crashed BOOLEAN 线程是否崩溃
threads.thread_name STRING 线程的名称
threads.queue_name STRING (仅限 Apple 应用)运行线程的队列
threads.signal_name STRING 导致应用崩溃的信号的名称,仅出现在崩溃的原生线程上
threads.signal_code STRING 导致应用崩溃的信号的代码;仅出现在崩溃的原生线程上
threads.crash_address INT64 导致应用崩溃的信号的地址;仅出现在崩溃的原生线程上
threads.code INT64 (仅限 Apple 应用)应用的自定义记录 NSError 的错误代码
threads.title STRING 线程的标题
threads.subtitle STRING 线程的副标题
threads.blamed BOOLEAN Crashlytics 是否已确定此帧是导致崩溃或错误的原因
threads.frames REPEATED RECORD 线程帧
threads.frames.line INT64 帧文件的行号
threads.frames.file STRING 帧文件的名称
threads.frames.symbol STRING 水化合符号,或原始符号(如果无法水化合)
threads.frames.offset INT64 包含代码的二进制图片中的字节偏移量
threads.frames.address INT64 包含代码的二进制图片中的地址
threads.frames.library STRING 包含帧的库的显示名
threads.frames.owner STRING 例如 DEVELOPERVENDORRUNTIMEPLATFORMSYSTEM
threads.frames.blamed BOOLEAN Crashlytics 是否已确定此帧是导致错误的原因
unity_metadata.unity_version STRING 此设备上运行的 Unity 版本
unity_metadata.debug_build BOOLEAN 指示该 build 是否为调试 build
unity_metadata.processor_type STRING 处理器类型
unity_metadata.processor_count INT64 处理器(内核)数量
unity_metadata.processor_frequency_mhz INT64 处理器的频率(以 MHz 为单位)
unity_metadata.system_memory_size_mb INT64 系统内存的大小(以 Mb 为单位)
unity_metadata.graphics_memory_size_mb INT64 图形内存(以 MB 为单位)
unity_metadata.graphics_device_id INT64 图形设备的标识符
unity_metadata.graphics_device_vendor_id INT64 图形处理器供应商的标识符
unity_metadata.graphics_device_name STRING 图形设备的名称
unity_metadata.graphics_device_vendor STRING 图形设备的供应商
unity_metadata.graphics_device_version STRING 图形设备的版本
unity_metadata.graphics_device_type STRING 图形设备的类型
unity_metadata.graphics_shader_level INT64 图形着色器级别
unity_metadata.graphics_render_target_count INT64 图形渲染目标的数量
unity_metadata.graphics_copy_texture_support STRING 支持以 Unity API 中定义的方式复制图形纹理
unity_metadata.graphics_max_texture_size INT64 纹理渲染专用大小上限
unity_metadata.screen_size_px STRING 屏幕大小(以像素为单位),格式为“宽 x 高”
unity_metadata.screen_resolution_dpi STRING 屏幕的 DPI(以浮点数表示)
unity_metadata.screen_refresh_rate_hz INT64 屏幕的刷新率(以 Hz 为单位)

使用数据洞察直观呈现导出的 Crashlytics 数据

Google 数据洞察可以将您在 BigQuery 中的 Crashlytics 数据集转换成更易于阅读和共享、可完全自定义的报告。

如需详细了解如何使用数据洞察,请阅读数据洞察快速入门指南:欢迎使用数据洞察

使用 Crashlytics 报告模板

数据洞察提供了一个针对 Crashlytics 的示例报告,其中包含一组来自已导出 Crashlytics BigQuery 架构的详细维度和指标。如果您已启用 Crashlytics BigQuery 流式导出,则可以在数据洞察模板的实时趋势页面上查看这些数据。您可以将该示例作为模板,根据自己应用的原始崩溃数据快速创建新报告并直观呈现数据:

  1. 打开 Crashlytics 数据洞察信息中心模板

  2. 点击右上角的使用模板

  3. 新数据源下拉列表中,选择创建新数据源

  4. 点击 BigQuery 卡片上的选择

  5. 选择一个包含导出的 Crashlytics 数据的表,方法是依次选择我的项目 > PROJECT_ID > firebase_crashlytics > TABLE_NAME

    您的批处理表格始终可供选择。如果启用了将 Crashlytics BigQuery 流式导出,那么您可以改为选择实时表。

  6. 配置下,将 Crashlytics 模板级设置为默认

  7. 点击连接,创建新的数据源。

  8. 点击添加到报告,以返回 Crashlytics 模板。

  9. 最后,点击创建报告,创建 Crashlytics 数据洞察信息中心模板的副本。

升级到新的导出基础设施

2024 年 10 月中旬,Crashlytics 推出了一种新的基础设施,用于将 Crashlytics 数据导出到 BigQuery。目前,升级到此新基础设施是个可选项。

此新的基础设施支持美国以外的 Crashlytics 数据集位置。

  • 如果您在 2024 年 10 月中旬之前启用了导出功能,那么现在可以选择更改数据导出位置,将数据导出到任何 BigQuery 支持的数据集位置。

  • 如果您在 2024 年 10 月中旬或之后启用了导出功能,则可以在设置期间选择任何 BigQuery 支持的数据集位置。

新基础设施的另一个不同之处在于,它不支持回填您启用导出功能之前存在的数据。(在使用旧的基础设施时,您最多可以回填导出功能启用日期之前 30 天的数据。)新的基础设施支持回填过去长达 30 天时间里的数据或您启用导出到 BigQuery 功能后最近日期中的数据(以最新的为准)。

升级的前提条件

在升级到新基础设施之前,请确认您满足以下前提条件:您当前的 BigQuery 批处理表具有与为已注册的 Firebase 应用设置的软件包 ID 或软件包名称匹配的标识符。

例如:

  • 如果您有一个名为 com_yourcompany_yourproject_IOSBigQuery 表,那么您应该在 Firebase 项目中注册有一个 Firebase iOS+ 应用,其软件包 ID 为 com.yourcompany.yourproject

  • 如果您有一个名为 com_yourcompany_yourproject_ANDROIDBigQuery 表,那么您应该在 Firebase 项目中注册有一个 Firebase Android 应用,其软件包名称为 com.yourcompany.yourproject

以下是查找在 Firebase 项目中注册的所有 Firebase 应用的方法:

  1. Firebase 控制台中,前往项目设置

  2. 向下滚动到“您的应用”卡片,然后点击所需的 Firebase 应用即可查看该应用的信息(包括其标识符)。

新的导出基础设施将根据为已注册的 Firebase 应用设置的软件包名称或软件包 ID 导出每个应用的数据。为了不中断您的 BigQuery 工作流,请务必确保您当前的批处理表已具有正确的名称,以便新的基础设施可以将所有新数据附加到现有表中。如果您的批处理表名称与已注册的 Firebase 应用不匹配,但您仍想升级,请与 Firebase 支持团队联系

如何升级到新的基础设施

如果您已启用导出功能,那么只需在 Firebase 控制台中关闭 Crashlytics 数据导出功能,然后再重新开启该功能,即可升级到新的基础设施。

下面是详细步骤:

  1. Firebase 控制台中,前往集成页面

  2. BigQuery 卡片中,点击管理

  3. Crashlytics 滑块切换到“关闭”位置以停用导出功能。出现提示时,确认您要停止数据导出。

  4. 立即再次将 Crashlytics 滑块切换到“开启”位置以重新启用导出功能。出现提示时,确认您要导出数据。

    您导出到 BigQueryCrashlytics 数据现在使用新的导出基础设施。