mcpField
F
firebase-crashlytics

firebase-crashlytics

github.com/evanca开发665191 次安装1 天前更新
代码仓库

关于 firebase-crashlytics

为 Flutter 应用集成 Firebase Crashlytics 提供参考指南,帮助开发者捕获错误、添加诊断信息、控制报告收集,并为混淆构建准备符号文件。

主要功能

  1. 01捕获致命和非致命错误
  2. 02报告 Flutter、异步及 isolate 错误
  3. 03添加自定义键、日志和用户标识
  4. 04控制收集并支持用户选择加入
  5. 05为混淆构建上传符号文件

适用场景

  1. 01在 Flutter 应用中配置崩溃报告
  2. 02为崩溃报告添加诊断上下文
  3. 03仅收集选择加入用户的报告
  4. 04检查混淆构建中的可读堆栈跟踪

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/evanca/flutter-ai-rules --skill firebase-crashlytics

安装后在 Claude Code 中输入/firebase-crashlytics确认已加载。

详细介绍

Firebase Crashlytics 技能

本技能介绍如何在 Flutter 应用中正确使用 Firebase Crashlytics。

使用场景

使用本技能的场景:

  • 在 Flutter 项目中实现崩溃报告。
  • 捕获致命错误、非致命异常以及异步/隔离区错误。
  • 使用键、日志和用户标识符自定义崩溃报告。
  • 配置数据收集的主动选择,或在调试版本中停用报告。
  • 为混淆版本上传符号文件。

1. 设置和配置

flutter pub add firebase_crashlytics
flutter pub add firebase_analytics  # enables breadcrumb logs for better crash context

运行 flutterfire configure,更新 Firebase 配置,并为 Android 添加所需的 Crashlytics Gradle 插件。

import 'package:firebase_crashlytics/firebase_crashlytics.dart';

混淆代码:

  • 对于使用 --split-debug-info 和/或 --obfuscate 构建的应用,请上传符号文件,以便获得可读的堆栈跟踪。
  • **iOS:**Flutter 3.12.0+ 和 Crashlytics Flutter 插件 3.3.4+ 会自动处理符号上传。
  • **Android:**使用 Firebase CLI(v11.9.0+)上传 Flutter 调试符号:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/symbols

2. 错误处理

在 main() 中配置全面的错误捕获,以捕获来自所有来源的错误:

致命 Flutter 错误:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  // Pass all uncaught fatal errors from the framework to Crashlytics
  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError;

  // Catch async errors not handled by the Flutter framework
  PlatformDispatcher.instance.onError = (error, stack) {
    FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
    return true;
  };

  runApp(MyApp());
}

**非致命 Flutter 错误:**使用 recordFlutterError,而不是 recordFlutterFatalError。

隔离区错误:

Isolate.current.addErrorListener(RawReceivePort((pair) async {
  final List<dynamic> errorAndStacktrace = pair;
  await FirebaseCrashlytics.instance.recordError(
    errorAndStacktrace.first,
    errorAndStacktrace.last,
    fatal: true,
  );
}).sendPort);

已捕获的异常(非致命):

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error',
  information: ['further diagnostic information about the error', 'version 2.0'],
);
  • Crashlytics 每个会话仅存储最近的 8 个非致命异常,更早的异常会被丢弃。

3. 自定义崩溃报告

自定义键(最多 64 个键值对,每个最多 1 kB):

FirebaseCrashlytics.instance.setCustomKey('str_key', 'hello');
FirebaseCrashlytics.instance.setCustomKey('bool_key', true);
FirebaseCrashlytics.instance.setCustomKey('int_key', 1);

自定义日志消息(每个会话上限:64 kB):

FirebaseCrashlytics.instance.log("User tapped on payment button");

用户标识符:

FirebaseCrashlytics.instance.setUserIdentifier("user-123");
// Clear by setting to blank string
FirebaseCrashlytics.instance.setUserIdentifier("");
  • 避免将唯一值(用户 ID、时间戳)直接写入异常消息;请改用自定义键。

4. 性能和优化

  • Crashlytics 在专用后台线程上处理异常,以尽量降低对性能的影响。
  • 致命报告会实时发送,无需重启应用。
  • 非致命报告会写入磁盘,并在下次发生致命错误或应用重启时发送。
  • 使用面包屑日志(需要 Firebase Analytics)了解导致崩溃的用户操作。

在调试版本中停用 Crashlytics:

if (kReleaseMode) {
  await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
} else {
  await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(false);
}

5. 测试和调试

强制触发测试崩溃,以验证设置:

FirebaseCrashlytics.instance.crash();

验证工作流:

  1. 以发布模式构建并运行应用。
  2. 触发测试崩溃。
  3. 重新打开应用,以便上传崩溃报告。
  4. 在 5 分钟内检查 Firebase Console Crashlytics 信息中心。
  5. 验证崩溃报告中是否显示自定义键、日志和用户标识符。
  • 使用代码混淆时,请验证堆栈跟踪是否已正确还原符号。

6. 主动选择报告

默认情况下,Crashlytics 会自动收集所有用户的崩溃报告。

如需让用户控制数据收集:

  • 停用自动报告,并仅在用户主动选择加入时通过 setCrashlyticsCollectionEnabled(true) 启用。
  • 覆盖值会在之后的所有应用启动中持续生效。
  • 如需让用户退出,请传入 false——该设置会从下次应用启动时生效。
  • 停用时,崩溃信息会存储在本地;之后若重新启用,本地存储的崩溃信息会发送到 Crashlytics。

参考资料

评论

支持 Markdown