Skip to main content

专业版 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平台 查看有没有上报成功。