Flutter性能监控插件umeng_apm_sdk的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

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

1 回复

更多关于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
);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!