Flutter性能监控插件umeng_apm_sdk的使用
Flutter性能监控插件umeng_apm_sdk的使用
Umeng Flutter APM SDK 能够全面监控Flutter端线上稳定性和性能的运行情况,洞悉设备运行体感。目前 SDK 提供了监控 Dart 异常、页面性能、页面帧率等能力。
示例代码
import 'package:umeng_apm_sdk/umeng_apm_sdk.dart';
import 'package:umeng_apm_sdk_example/pages/network.dart';
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
import 'package:flutter/material.dart';
import './pages/exception.dart';
import './pages/white_screen.dart';
import './pages/lazy_load_page.dart';
import './pages/list.dart';
Map<String, WidgetBuilder> routes = {
"/": (context) => HomePage(),
"/exception": (context) => ExceptionPage(),
"/white_screen": (context) => WhiteScreenPage(),
"/list": (context) => ListPage(),
"/lazy_load": (context) => ScrollLazyLoadPage(),
'/network_test': (context) => NetworkPage(),
};
void main() {
final UmengApmSdk umengApmSdk = UmengApmSdk(
name: '',
bver: '',
flutterVersion: '3.10.0',
engineVersion: 'd44b5a94c9',
enableLog: true,
enableTrackingPageFps: true,
enableTrackingPagePerf: true,
enableTrackingApi: true,
errorFilter: {
"mode": "ignore",
// "rules": [RegExp('RangeError')],
"rules": [],
},
initFlutterBinding: MyApmWidgetsFlutterBinding.ensureInitialized,
// onError: (exception, stack) {},
);
umengApmSdk.init(appRunner: (observer) async {
// 确保去掉原有的WidgetsFlutterBinding.ensureInitialized(),以免出现重复初始化绑定的异常造成无法正常初始化,
// SDK内部已通过initFlutterBinding入参带入继承的WidgetsFlutterBinding实现初始化操作
// 依赖ensureInitialized()初始化的代码可在此调用
// 需要异步获取设置应用名称和版本号可在此回调中操作
// SDK实例化的设置可先将name和bver 为 "",然后通过以下方式进行设置
// 如:umengApmSdk.name = 'app_demo';
umengApmSdk.name = 'app_demo';
umengApmSdk.bver = '1.0.0+9';
return MyApp(observer);
});
}
class MyApmWidgetsFlutterBinding extends ApmWidgetsFlutterBinding {
[@override](/user/override)
void handleAppLifecycleStateChanged(AppLifecycleState state) {
// 添加自己的实现逻辑
// print('AppLifecycleState changed to $state');
super.handleAppLifecycleStateChanged(state);
}
static WidgetsBinding? ensureInitialized() {
MyApmWidgetsFlutterBinding();
return WidgetsBinding.instance;
}
}
// ignore: must_be_immutable
class MyApp extends StatelessWidget {
MyApp([this._navigatorObserver]);
NavigatorObserver? _navigatorObserver;
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
visualDensity: VisualDensity.adaptivePlatformDensity,
),
routes: routes,
initialRoute: "/",
navigatorObservers: <NavigatorObserver>[
_navigatorObserver ?? ApmNavigatorObserver.singleInstance
],
);
}
}
class HomePage extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class CustomTransitionPage extends PageRouteBuilder {
final Widget widget;
CustomTransitionPage({required this.widget})
: super(
pageBuilder: (BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) {
return widget;
},
transitionsBuilder: (BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child) {
Animation<Offset> customAnimation = Tween<Offset>(
begin: Offset(3.0, 0.0),
end: Offset.zero,
).animate(animation);
return SlideTransition(
position: customAnimation,
child: child,
);
},
);
}
class _MyAppState extends State {
[@override](/user/override)
void initState() {
super.initState();
UmengCommonSdk.initCommon(
'6521276cd94a131a1ae7ab1f', '6521029cd94a131a1ae7aac3', 'Umeng');
UmengCommonSdk.setPageCollectionModeManual();
}
void runCustomException() {
try {
// 模拟数组越界错误
List<String> numList = ['1', '2'];
print(numList[5]);
} catch (e) {
ExceptionTrace.captureException(
exception: Exception(e), extra: {"user": '123'});
}
}
void _showDialog() {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("AlertDialog Title"),
content: Text("AlertDialog Body"),
actions: <Widget>[
TextButton(
child: Text("CANCEL"),
onPressed: () => Navigator.of(context).pop(),
),
TextButton(
child: Text("OK"),
onPressed: () => Navigator.of(context).pop(),
),
],
);
},
);
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextButton(
child: Text('dart error page'),
onPressed: () async {
Navigator.pushNamed(context, '/exception');
}),
TextButton(
child: Text('dart error new page'),
onPressed: () async {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => ExceptionPage()));
}),
TextButton(
child: Text('Page Transition'),
onPressed: () async {
Navigator.of(context)
.push(CustomTransitionPage(widget: ExceptionPage()));
}),
TextButton(
child: Text('dart error release page'),
onPressed: () async {
Navigator.of(context).pushReplacementNamed('/exception');
}),
TextButton(
child: Text("Show Dialog"),
onPressed: _showDialog,
),
TextButton(
child: Text("dart white screen exception"),
onPressed: () async {
Navigator.of(context).pushReplacementNamed('/white_screen');
}),
TextButton(
child: Text("lazy loading text list"),
onPressed: () async {
Navigator.pushNamed(context, '/list');
}),
TextButton(
child: Text("lazy loading picture list"),
onPressed: () async {
Navigator.pushNamed(context, '/lazy_load');
}),
TextButton(
child: Text("捕获主动上报 exception"),
onPressed: () {
runCustomException();
}),
TextButton(
child: Text("网络测试"),
onPressed: () {
Navigator.pushNamed(context, '/network_test');
}),
]),
),
);
}
}
更多关于Flutter性能监控插件umeng_apm_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter性能监控插件umeng_apm_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
umeng_apm_sdk
是一个用于 Flutter 应用的性能监控插件,由友盟(Umeng)提供。它可以帮助开发者监控应用的性能指标,如卡顿、崩溃、启动时间等。以下是使用 umeng_apm_sdk
的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 umeng_apm_sdk
插件的依赖。
dependencies:
flutter:
sdk: flutter
umeng_apm_sdk: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 初始化 SDK
在你的 Flutter 应用启动时,需要初始化 umeng_apm_sdk
。通常可以在 main.dart
文件的 main
函数中进行初始化。
import 'package:flutter/material.dart';
import 'package:umeng_apm_sdk/umeng_apm_sdk.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化 Umeng APM SDK
await UmengApmSdk.init(
appKey: 'YOUR_APP_KEY', // 替换为你的友盟 App Key
channel: 'default', // 渠道号,默认为 'default'
debug: true, // 是否开启调试模式
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter App',
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Performance Monitoring'),
),
body: Center(
child: Text('Hello, Umeng APM SDK!'),
),
);
}
}
3. 监控特定代码块
你可以使用 UmengApmSdk
提供的方法来监控特定的代码块,例如监控一段耗时操作。
void performHeavyTask() async {
await UmengApmSdk.startTrack('heavy_task'); // 开始监控
// 模拟耗时操作
await Future.delayed(Duration(seconds: 2));
await UmengApmSdk.endTrack('heavy_task'); // 结束监控
}
4. 监控页面加载时间
你可以使用 UmengApmSdk
来监控页面的加载时间。
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
UmengApmSdk.startTrack('HomePage'); // 开始监控页面加载
return Scaffold(
appBar: AppBar(
title: Text('Flutter Performance Monitoring'),
),
body: Center(
child: Text('Hello, Umeng APM SDK!'),
),
);
}
@override
void dispose() {
UmengApmSdk.endTrack('HomePage'); // 结束监控页面加载
super.dispose();
}
}
5. 监控崩溃和异常
umeng_apm_sdk
会自动监控应用的崩溃和异常情况。你也可以手动记录自定义的异常。
void reportCustomException() {
try {
// 可能会抛出异常的代码
throw Exception('Custom exception');
} catch (e, stackTrace) {
UmengApmSdk.reportError(e, stackTrace); // 手动上报异常
}
}
6. 其他功能
umeng_apm_sdk
还提供了其他功能,如网络请求监控、内存泄漏检测等。你可以参考官方文档来了解更多详细的功能和使用方法。
7. 发布应用
在发布应用时,请确保将 debug
参数设置为 false
,以便在生产环境中使用。
await UmengApmSdk.init(
appKey: 'YOUR_APP_KEY',
channel: 'default',
debug: false, // 生产环境下设置为 false
);