Flutter崩溃报告与错误收集插件bugly_crash的使用
Flutter崩溃报告与错误收集插件bugly_crash的使用
通过使用此插件,Flutter应用程序可以监控发生的异常,并将错误或崩溃上传至Bugly服务器。
该插件基于Bugly原生崩溃SDK开发。
Android 原生SDK文档:
iOS崩溃原生SDK文档:
pub.dev:
示例代码
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
更多关于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。