专业版 SDK 接入
Flutter APM 专业版 简介
Flutter APM 专业版在Flutter APM基础上合并了APM SDK和Bugly SDK, 重写了底层逻辑。
快速接入
首次使用,需要在 Bugly平台 注册对应的产品组,及添加平台,以便获得对应的 AppKey 和 AppID 供后续接入使用。
在项目的
pubspec.yaml
文件中添加bugly_pro_flutter
的依赖:
bugly_pro_flutter:
version: ^0.4.6
运行
flutter pub get
更新依赖。在项目
main.dart
文件的main
函数中添加初始化代码:
import 'package:bugly_pro_flutter/bugly.dart';
void main() {
BuglyOptions options = BuglyOptions(appId: '', appKey: '', bundleId: '');
options.monitorTypes = [
MonitorType.launchMetric,
MonitorType.looperMetric,
MonitorType.looperStack,
MonitorType.exception
];
options.userId = 'pro_tester';
Bugly.init(options, appRunner: (){
runApp(const MyApp());
},
beforeInitRunner: (options){
options.appId = 'afxxxxb01'; // 注册产品的appid
options.appKey = 'aef434ba-xxxx-xxxx-xxxx-030b10aae88b'; // 注册产品的appkey
options.bundleId = 'com.xxx.bundleid';
});
}
接入专业版后如果启动crash报Abort message: 'JNI DETECTED ERROR IN APPLICATION: java_class == null in call to GetStaticMethodID
,且项目开启了代码混淆,需要将bugly相关的类加入keep白名单:
-keep class java.com.tencent.bugly.**{*;}
如果启动报dart错误"Zone mismatch."
一般是WidgetsFlutterBinding.ensureInitialized();
是不是和runApp()
在不同的zone中运行。修复方法是:
import 'package:bugly_pro_flutter/bugly.dart';
void main() {
BuglyOptions options = BuglyOptions(appId: '', appKey: '', bundleId: '');
options.monitorTypes = [
MonitorType.launchMetric,
MonitorType.looperMetric,
MonitorType.looperStack,
MonitorType.exception
];
options.userId = 'pro_tester';
WidgetsFlutterBinding.ensureInitialized();
final zone = Zone.current; // !!!!!!获取zone!!!!!
Bugly.init(options, appRunner: (){
// runApp(const MyApp());
zone.run(() => runApp(const MyApp())); // !!!!!!这里改成在zone中运行runApp!!!!!!!
},
beforeInitRunner: (options){
options.appId = 'afxxxxb01'; // 注册产品的appid
options.appKey = 'aef434ba-xxxx-xxxx-xxxx-030b10aae88b'; // 注册产品的appkey
options.bundleId = 'com.xxx.bundleid';
});
}
- 生命周期监听
在 App 中设置 RMonitorNavigatorObserver
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('APM Example'),
),
body: Center(
child: MyHome(),
),
),
// 添加 RMonitorNavigatorObserver
navigatorObservers: [RMonitorNavigatorObserver()],
routes: {
'MainPage': (context) => MainPage(),
'FirstPage': (context) => FirstPage(),
'SecondPage': (context) => SecondPage(),
},
);
}
}
如果是接入了 TRouter 等混合栈框架,由于其接管了原生的Navigator
,需要将 RMonitorNavigatorObserver
设置到混合栈框架中,如下:
runApp(MaterialApp(
home: TRouteContainer(navigatorObservers: RMonitorNavigatorObserver(),),
));
注意:TRouter 需要使用 2.5.7+ 版本,否则部分生命周期会丢失
- 设置启动监控埋点
启动监听需要在 Native 打开 Flutter 页面时,设置下进入 Flutter 页面埋点:
Android:
Intent intent = new Intent(MainActivity.this, TestFlutterActivity.class);
MainActivity.this.startActivity(intent);
FlutterLaunchMonitor.onEnterFlutter();
iOS:
[[TFlutterLaunchMonitor sharedInstance] onEnterFlutter];
- 用户 ID 设置(可选)
由于部分 app 无法在初始化时设置 UserID,可调用 RMonitor#setUserId
进行设置。
- 构造一个
dart
错误,然后去 Bugly平台 查看有没有上报成功。