Flutter崩溃报告与分析插件flutter_crashlytics的使用

Flutter崩溃报告与分析插件flutter_crashlytics的使用

flutter_crashlytics

pub package

Flutter 插件用于启用 Crashlytics 报告。

Setup

Firebase Crashlytics

如果您使用的是 Firebase 而不是 Fabric,您必须先按照此教程设置您的应用以使用 Firebase: https://codelabs.developers.google.com/codelabs/flutter-firebase/#4

对于 Fabric 和 Firebase 的设置步骤相同,除了对于 Firebase,您不会获得 API 密钥,因此无需在任何地方添加它。

Android

要在 Android 端设置 Crashlytics,您需要在清单文件中设置 Fabric ID,如下所示: (仅当使用 Fabric 时执行此操作,不适用于 Firebase,因为您不会有 API 密钥)

<meta-data
    android:name="io.fabric.ApiKey"
    android:value="YOUR_ID_HERE" />

您还需要更改 build.gradle 文件,如下所示:

buildscript {
    repositories {
        ...
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
        ...
    }
}

然后应用 Fabric 插件 <code>apply plugin: 'io.fabric'</code>

仅此而已。

Symbolicating Native Android Crashes

不幸的是,即使纯 Dart 项目也无法完全避免原生崩溃。如果没有以下设置,像 SIGSEGV 这样的原生崩溃将在 Crashlytics 中显示为空白堆栈跟踪。以下是获取符号的方法:

apply plugin: 'io.fabric' 后添加以下内容到 build.gradle

crashlytics {
    enableNdk true
    androidNdkOut "../../debugSymbols"
    androidNdkLibsOut "../../build/app/intermediates/transforms/stripDebugSymbol/release/0/lib"
}

确保已安装 NDK 包,否则 stripDebugSymbol 目录将不会被创建。

现在设置一个发布脚本来填充 debugSymbols 目录,按照以下指南进行操作: https://github.com/flutter/flutter/wiki/Crashes

# 正常构建我们的应用
flutter -v build apk --release

### BEGIN MODIFICATIONS

# 将 mergeJniLibs 复制到 debugSymbols
cp -R ./build/app/intermediates/transforms/mergeJniLibs/release/0/lib debugSymbols

# libflutter.so 在这里与 artifacts.zip 中找到的符号.zip 中相同
cd debugSymbols/armeabi-v7a

# 下载对应的带调试符号的 libflutter.so
ENGINE_VERSION=`cat $HOME/flutter/bin/internal/engine.version`
gsutil cp gs://flutter_infra/flutter/${ENGINE_VERSION}/android-arm-release/symbols.zip .

# 替换 libflutter.so
unzip -o symbols.zip
rm -rf symbols.zip

# 将符号上传到 Crashlytics
cd ../../android
./gradlew crashlyticsUploadSymbolsRelease

### END MODIFICATIONS

# 正常发布您的应用
cd ../..
fastlane submit_playalpha

iOS

在 iOS 端,您需要在 Info.plist 文件中设置您的 Fabric ID,如下所示: (仅当使用 Fabric 时执行此操作,不适用于 Firebase,因为您不会有 API 密钥)

<key>Fabric</key>
<dict>
    <key>APIKey</key>
    <string>YOUR_ID_HERE</string>
    <key>Kits</key>
    <array>
        <dict>
            <key>KitInfo</key>
            <dict/>
            <key>KitName</key>
            <string>Crashlytics</string>
        </dict>
    </array>
</dict>

通过添加新键关闭自动收集功能到您的 Info.plist 文件中(如果您希望符合 GDPR 规范):

键:firebase_crashlytics_collection_enabled

值:false

别忘了在构建阶段的“运行脚本”步骤中添加您的应用的构建信息文件路径(无论 Xcode 版本如何)。 如果使用的是 Xcode 10,您还必须在构建阶段的输入文件字段中添加您的应用的构建信息文件路径:

$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
ios run script

就这样 :)

Flutter

在 Flutter 端,您需要让插件处理 Flutter 崩溃。

您的 main 方法应如下所示:

void main() async {
  bool isInDebugMode = false;

  FlutterError.onError = (FlutterErrorDetails details) {
    if (isInDebugMode) {
      // 在开发模式下直接打印到控制台。
      FlutterError.dumpErrorToConsole(details);
      Zone.current.handleUncaughtError(details.exception, details.stack);
    } else {
      // 在生产模式下报告给应用程序区域以报告给 Crashlytics。
      Zone.current.handleUncaughtError(details.exception, details.stack);
    }
  };

  await FlutterCrashlytics().initialize();

  runZoned<Future<Null>>(() async {
    runApp(MyApp());
  }, onError: (error, stackTrace) async {
    // 每当发生错误时,调用 `reportCrash` 函数。这将根据环境将 Dart 错误发送到我们的开发控制台或 Crashlytics。
    await FlutterCrashlytics().reportCrash(error, stackTrace, forceCrash: false);
  });
}

更多关于Flutter崩溃报告与分析插件flutter_crashlytics的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter崩溃报告与分析插件flutter_crashlytics的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_crashlytics 是一个用于 Flutter 应用的崩溃报告和分析插件,它集成了 Firebase Crashlytics,可以帮助开发者捕获应用中的崩溃信息,并在 Firebase 控制台中查看和分析这些崩溃报告。以下是如何在 Flutter 项目中使用 flutter_crashlytics 的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_crashlytics 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_crashlytics: ^2.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 配置 Firebase

在使用 flutter_crashlytics 之前,你需要在 Firebase 控制台中创建一个项目,并将你的 Flutter 应用添加到该项目中。

  1. 访问 Firebase 控制台
  2. 创建一个新的项目或选择一个现有项目。
  3. 添加你的 Android 和 iOS 应用到 Firebase 项目中。
  4. 下载 google-services.json (Android) 和 GoogleService-Info.plist (iOS) 配置文件,并将它们分别放在 android/appios/Runner 目录中。

3. 配置 Android 项目

android/build.gradle 文件中添加以下内容:

buildscript {
  repositories {
    google()
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:4.1.0'  // 确保使用兼容的版本
    classpath 'com.google.gms:google-services:4.3.8'  // 添加 Google Services 插件
  }
}

allprojects {
  repositories {
    google()
    mavenCentral()
  }
}

android/app/build.gradle 文件中添加以下内容:

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'  // 应用 Google Services 插件

dependencies {
  implementation 'com.google.firebase:firebase-crashlytics:18.2.1'  // 添加 Firebase Crashlytics 依赖
}

4. 配置 iOS 项目

ios/Podfile 文件中添加以下内容:

platform :ios, '10.0'

target 'Runner' do
  use_frameworks!
  use_modular_headers!

  pod 'Firebase/Crashlytics'
end

然后运行 pod install 来安装 iOS 依赖。

5. 初始化 flutter_crashlytics

在你的 Flutter 应用中初始化 flutter_crashlytics。通常,你可以在 main.dart 文件中进行初始化:

import 'package:flutter/material.dart';
import 'package:flutter_crashlytics/flutter_crashlytics.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await FlutterCrashlytics().initialize();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

6. 捕获未捕获的异常

flutter_crashlytics 可以自动捕获未捕获的异常并将其发送到 Firebase Crashlytics。你只需要在初始化时启用它:

await FlutterCrashlytics().initialize(
  enableInDev: true,  // 在开发环境中启用 Crashlytics
  enableCrashlytics: true,  // 启用 Crashlytics
);

7. 手动记录异常

你也可以手动记录异常或日志信息:

try {
  // 你的代码
} catch (error, stackTrace) {
  await FlutterCrashlytics().reportCrash(error, stackTrace);
}

8. 测试崩溃报告

为了确保一切正常工作,你可以手动触发一个崩溃来测试:

FlutterCrashlytics().crash();
回到顶部