Flutter崩溃报告与错误收集插件bugly_crash的使用

Flutter崩溃报告与错误收集插件bugly_crash的使用

通过使用此插件,Flutter应用程序可以监控发生的异常,并将错误或崩溃上传至Bugly服务器。

该插件基于Bugly原生崩溃SDK开发。

Android 原生SDK文档:

Android 原生SDK文档

iOS崩溃原生SDK文档:

iOS崩溃原生SDK文档

pub.dev:

bugly_crash插件

示例代码

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

import 'package:flutter/services.dart';
import 'package:bugly_crash/bugly.dart';
import 'package:bugly_crash/buglyLog.dart';
import 'dart:io';

//void main() => runApp(MyApp());
Map<String,String> extraInfo = {"key1":"value1","key2":"value2","key3":"value1"};

Future<Null> main() async {
  // 一、这里配置上报APP未捕获到的异常,业务可以自由决定上报的信息
  FlutterError.onError = (FlutterErrorDetails details) async {
    print("zone current print error");
    Zone.current.handleUncaughtError(details.exception, details.stack!);
  };

  runZonedGuarded<Future<Null>>(() async {
    runApp(MyApp());
  }, (error, stackTrace) async {
    String type = "flutter uncaught error";
    await Bugly.postException(type:type,error: error.toString(),stackTrace: stackTrace.toString(),extraInfo:extraInfo);
  });
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
    if(Platform.isAndroid){
      initBuglyAndroid();
    } else if(Platform.isIOS){
      initBuglyIos();
    }
  }

  void initBuglyAndroid(){
    //Bugly.setAndroidServerUrl(url: "https://xxxx");
    Bugly.initAndroidCrashReport(appId:"c50a711298",isDebug: true);
    Bugly.setUserId(userId:"androiduser");
    // 如果遇到AndroidId采集隐私问题,可以参考https://github.com/BuglyDevTeam/Bugly-Android-Demo
    Bugly.setAndroidDeviceId(deviceId: "test");
    Bugly.setUserSceneTag(userSceneTag: 111437);
    Bugly.setAppVersion(appVersion:"1.9.3");
    Bugly.setAndroidAppChannel(appChannel: "test");
    // bugly自定义日志, 可在"跟踪日志"页面查看
    BuglyLog.d(tag:"bugly",content:"debugvalue");
    BuglyLog.i(tag:"bugly",content:"infovalue");
    BuglyLog.v(tag:"bugly",content:"verbosevalue");
    BuglyLog.w(tag:"bugly",content:"warnvalue");
    BuglyLog.e(tag:"bugly",content:"errorvalue");
    // 自定义map参数 可在"跟踪数据"页面查看
    Bugly.putUserData(userKey:"userkey1",userValue:"uservalue1");
    Bugly.putUserData(userKey:"userkey2",userValue:"uservalue2");
  }

  void initBuglyIos(){
    //Bugly.initIosCrashReport(appId:"87654c7bfa",debugMode: true,serverUrl: "");
    Bugly.initIosCrashReport(appId:"87654c7bfa",debugMode: true);
    Bugly.setUserSceneTag(userSceneTag: 116852);
    Bugly.setAppVersion(appVersion:"1.9.2");
    Bugly.putUserData(userKey:"userkey1",userValue:"uservalue1");
    Bugly.setUserId(userId:"iosuser");
    BuglyLog.d(tag:"bugly",content:"debugvalue");
    BuglyLog.i(tag:"bugly",content:"infovalue");
    BuglyLog.w(tag:"bugly",content:"warnvalue");
    BuglyLog.v(tag:"bugly",content:"verbosevalue");
    BuglyLog.e(tag:"bugly",content:"errorvalue");
  }

  // 平台消息是异步的,所以我们初始化在一个异步方法中。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能失败,所以我们使用try/catch PlatformException。
    try {
      platformVersion = await Bugly.platformVersion;
    } on PlatformException{
      platformVersion = 'Failed to get platform version.';
    }

    // (1) 测试APP自己捕获到的异常上报
    try {
      var list = [1,2];
      list[3] = 1;
    } catch (e){
      String type = "flutter caught error";
      await Bugly.postException(type:type,error:"null exception",stackTrace:e.toString(),extraInfo:extraInfo);
    }

    // (2) 测试APP未捕获到的异常上报
    // throw 'bugly flutter uncaught error test';
    var list = [1,2];
    list[3] = 1;

    // 如果小部件从树中移除时异步平台消息还在飞行中,我们希望丢弃回复而不是调用
    // setState来更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  _onClick(){
    throw 'bugly flutter uncaught error test';
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: GestureDetector(
            onTap: _onClick,
            child: Text('Running on: $_platformVersion\n'),
          )
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中集成和使用Bugly崩溃报告与错误收集插件(bugly_crash)的示例代码。假设你已经有一个Flutter项目,并且希望集成Bugly来捕获崩溃和错误报告。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加bugly_crash依赖:

dependencies:
  flutter:
    sdk: flutter
  bugly_crash: ^x.y.z  # 替换为最新版本号

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

2. 配置Android

android/app/src/main/AndroidManifest.xml中配置Bugly所需的权限和meta-data:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <!-- 其他配置 -->

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_LOGS"/>

    <application
        android:name=".MyApplication"  <!-- 确保这个类存在并且继承了FlutterApplication -->
        ... >

        <!-- Bugly配置 -->
        <meta-data
            android:name="com.tencent.bugly.BuglySDK"
            android:value="YOUR_BUGLY_APPID"/>  <!-- 替换为你的Bugly App ID -->

        <!-- 其他配置 -->

    </application>
</manifest>

3. 初始化Bugly

android/app/src/main/kotlin/com/example/yourapp/MyApplication.kt(或Java文件)中初始化Bugly:

// MyApplication.kt
package com.example.yourapp

import android.app.Application
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
import com.tencent.bugly.crashreport.CrashReport

class MyApplication: Application() {
    override fun onCreate() {
        super.onCreate()
        
        // 初始化Bugly
        val appId = "YOUR_BUGLY_APPID"  // 替换为你的Bugly App ID
        val channel = "default"  // 渠道标识,可以根据需要设置
        CrashReport.initCrashReport(applicationContext, appId, true)
        CrashReport.setUserIdentifier(channel)  // 设置用户标识,比如渠道标识
    }

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        GeneratedPluginRegistrant.registerWith(flutterEngine)
    }
}

4. 在Flutter中使用Bugly

在Flutter代码中使用bugly_crash插件来捕获崩溃。例如,你可以创建一个函数来触发一个崩溃:

// main.dart
import 'package:flutter/material.dart';
import 'package:bugly_crash/bugly_crash.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Bugly Crash Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 触发崩溃
              crashApp();
            },
            child: Text('Crash App'),
          ),
        ),
      ),
    );
  }

  void crashApp() {
    // 使用Bugly捕获崩溃
    BuglyCrash.instance.init(appId: "YOUR_BUGLY_APPID", isDebug: false);
    
    // 模拟崩溃
    int result = 1 / 0;  // 这将导致一个运行时异常
  }
}

注意:在真实应用中,你通常不会直接调用crashApp函数来触发崩溃。这个示例只是为了展示如何使用bugly_crash插件捕获崩溃。

5. 捕获未捕获的异常

你还可以捕获未捕获的异常,确保所有未处理的异常都被发送到Bugly:

import 'dart:async';
import 'package:flutter/foundation.dart' show kReleaseMode;

void main() {
  // 初始化Bugly
  BuglyCrash.instance.init(appId: "YOUR_BUGLY_APPID", isDebug: !kReleaseMode);

  // 捕获未捕获的异常
  FlutterError.onError = (FlutterErrorDetails details) {
    BuglyCrash.instance.reportError(details.exception, details.stack);
    Zone.current.handleUncaughtException(details.exception, details.stack);
  };

  // 捕获未捕获的错误(如异步错误)
  Isolate.uncaughtExceptions.listen((error, stackTrace) {
    BuglyCrash.instance.reportError(error, stackTrace);
  });

  runApp(MyApp());
}

这样,你就可以在Flutter项目中集成并使用Bugly进行崩溃报告和错误收集了。请确保替换示例代码中的YOUR_BUGLY_APPID为你的实际Bugly App ID。

回到顶部