Flutter性能监控插件qt_apm_sdk的使用

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

Flutter性能监控插件qt_apm_sdk的使用

QuickTracking Flutter APM SDK 能够全面监控Flutter端线上稳定性和性能的运行情况,洞悉设备运行体感。目前 SDK 提供了监控 Dart 异常、页面性能、页面帧率等能力。

集成文档

APM Flutter SDK 集成文档链接:
https://help.aliyun.com/document_detail/2788809.html


完整示例代码

以下是一个完整的示例代码,展示了如何集成和使用 qt_apm_sdk 插件。

// example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:qt_common_sdk/qt_common_sdk.dart';
import 'package:qt_apm_sdk/qt_apm_sdk.dart';

import './pages/exception.dart';
import './pages/lazy_load_page.dart';
import './pages/list.dart';
import './pages/white_screen.dart';

// 定义路由表
Map<String, WidgetBuilder> routes = {
  "/": (context) => HomePage(),
  "/exception": (context) => ExceptionPage(),
  "/white_screen": (context) => WhiteScreenPage(),
  "/list": (context) => ListPage(),
  "/lazy_load": (context) => ScrollLazyLoadPage(),
};

void main() {
  // 初始化 QuickTrackingFlutterApmSdk
  final QuickTrackingFlutterApmSdk qtApmSdk = QuickTrackingFlutterApmSdk(
    name: '', // 应用或模块名称
    bver: '', // 应用或模块版本+构建号
    flutterVersion: '3.29.0', // Flutter SDK 版本
    engineVersion: 'f73bfc4522', // Flutter 引擎版本
    enableLog: true, // 是否开启SDK日志打印 (默认关闭)
    enableTrackingPageFps: true, // 开启监测页面帧率(默认关闭)
    enableTrackingPagePerf: true, // 开启监测页面性能(默认关闭)
    errorFilter: { 
      "mode": "ignore",
      // "rules": [RegExp('RangeError')],
      "rules": [],
    },
    trackDomain: "", // 收数域名,如果通过统计SDK配置收数域名,此处可不配置
    initFlutterBinding: MyApmWidgetsFlutterBinding.ensureInitialized,
    // onError: (exception, stack) {},
  );

  // 初始化 SDK
  qtApmSdk.init(appRunner: (observer) async {
    // 确保去掉原有的 WidgetsFlutterBinding.ensureInitialized(),以免出现重复初始化绑定的异常
    // SDK 内部已通过 initFlutterBinding 入参带入继承的 WidgetsFlutterBinding 实现初始化操作
    // 依赖 ensureInitialized() 初始化的代码可在此调用
    // 需要异步获取设置应用名称和版本号可在此回调中操作
    qtApmSdk.name = 'app_demo'; // 设置应用名称
    qtApmSdk.bver = '2.5.0'; // 设置应用版本
    return MyApp(observer); // 返回根 Widget
  });
}

// 自定义 WidgetsFlutterBinding 继承类
class MyApmWidgetsFlutterBinding extends ApmWidgetsFlutterBinding {
  @override
  void handleAppLifecycleStateChanged(AppLifecycleState state) {
    // 添加自己的实现逻辑
    // print('AppLifecycleState changed to $state');
    super.handleAppLifecycleStateChanged(state);
  }

  static WidgetsBinding? ensureInitialized() {
    MyApmWidgetsFlutterBinding();
    return WidgetsBinding.instance;
  }
}

// 根 Widget
class MyApp extends StatelessWidget {
  MyApp([this._navigatorObserver]);

  NavigatorObserver? _navigatorObserver;

  @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
  _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
  void initState() {
    super.initState();
    // 初始化通用 SDK 设置
    QTCommonSdk.setCustomDomain("主收数域名", "副收数域名");
    QTCommonSdk.setLogEnabled(true);
    QTCommonSdk.initCommon("android应用appkey", "iOS应用标识", "发布渠道");

    // 模拟异常捕获
    runCustomException();
  }

  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
  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();
                  }),
            ]),
      ),
    );
  }
}

功能说明

  1. Dart 异常监控
    使用 ExceptionTrace.captureException 方法捕获并上报自定义异常。例如:
    ExceptionTrace.captureException(
        exception: Exception(e), extra: {"user": '123'});

更多关于Flutter性能监控插件qt_apm_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter性能监控插件qt_apm_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


qt_apm_sdk 是一个用于 Flutter 应用的性能监控插件,通常用于监控应用的性能指标,如启动时间、内存使用、CPU 使用率、网络请求等。以下是如何在 Flutter 项目中使用 qt_apm_sdk 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 qt_apm_sdk 的依赖。

dependencies:
  flutter:
    sdk: flutter
  qt_apm_sdk: ^版本号  # 请替换为最新的版本号

然后运行 flutter pub get 来获取依赖。

2. 初始化 SDK

在你的 Flutter 应用的入口文件(通常是 main.dart)中初始化 qt_apm_sdk

import 'package:flutter/material.dart';
import 'package:qt_apm_sdk/qt_apm_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 qt_apm_sdk
  await QtApmSdk.init(
    appKey: 'your_app_key',  // 替换为你的 App Key
    channel: 'your_channel', // 替换为你的渠道信息
    enableDebug: true,       // 是否开启调试模式
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

3. 监控性能指标

qt_apm_sdk 会自动监控一些基本的性能指标,如启动时间、内存使用、CPU 使用率等。你也可以手动记录一些自定义事件或性能指标。

import 'package:flutter/material.dart';
import 'package:qt_apm_sdk/qt_apm_sdk.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                // 记录自定义事件
                QtApmSdk.trackEvent('button_click', {'button_name': 'demo_button'});
              },
              child: Text('Click Me'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 监控网络请求

qt_apm_sdk 还可以监控网络请求的性能。你可以在网络请求的代码中手动记录请求的开始和结束时间。

import 'dart:io';
import 'package:qt_apm_sdk/qt_apm_sdk.dart';

void fetchData() async {
  final startTime = DateTime.now().millisecondsSinceEpoch;

  try {
    final response = await HttpClient().getUrl(Uri.parse('https://example.com'));
    final endTime = DateTime.now().millisecondsSinceEpoch;

    // 记录网络请求性能
    QtApmSdk.trackNetworkRequest(
      url: 'https://example.com',
      method: 'GET',
      startTime: startTime,
      endTime: endTime,
      statusCode: response.statusCode,
      responseSize: response.contentLength,
    );
  } catch (e) {
    // 记录网络请求错误
    QtApmSdk.trackNetworkError(
      url: 'https://example.com',
      method: 'GET',
      startTime: startTime,
      endTime: DateTime.now().millisecondsSinceEpoch,
      errorMessage: e.toString(),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!