Flutter性能监控插件x_apm的使用

Flutter性能监控插件x_apm的使用

介绍

XPM SDK 能够全面监控Flutter端线上稳定性和性能的运行情况。目前SDK提供以下功能:

  • 页面FPS监控
  • 网络监控
  • 页面性能监控(FP、FCP、FMP)
  • Flutter/Dart 错误监控

使用

首先需要导入 x_apm 包并初始化插件。

import 'package:x_apm/x_apm.dart';

void main() {
  XApmManager.instance.init(
      config: ApmConfig(
          // 是否使用性能监控
          enable: true,
          handlers: [FloatWindowHandler(globalKey)],
          endpoint: 
              "https://hyperf.debug.591.com.hk/api/flutter/apm/save-record"));
  // 开启网络监控
  HttpOverrides.global = ApmHttpOverrides();
  // 错误收集
  XApm(appRunner: () => runApp(const MyApp()));
}

MyApp 类中设置 navigatorKeynavigatorObservers 以启用路由监控。

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      navigatorKey: globalKey,
      routes: generateRoutes(),
      theme: ThemeData(primarySwatch: Colors.blue, useMaterial3: false),
      // 添加路由监控
      navigatorObservers: [ApmNavigatorObserver.instance],
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

配置

X-APM支持以下配置选项:

/// 是否启用
final bool enable;

/// 打印器列表
final List<PrintlnHandler> handlers;

/// 上传地址
final String endpoint;

/// 用于外界筛选需要上传的数据,返回true则进行上传,false不上传
final bool Function(Data data)? filterFunction;

/// 用于外界对数据进行转换
final Transformer Function() transformer;

/// 用于外界对数据进行发送
final Sender Function() sender;

/// 用于外界自定义http请求
final http.Client Function() httpClient;

/// 发送数据的网络策略
final NetworkType networkTypePolicy;

/// 两次数据发送的最小时间间隔,单位毫秒
final int flushInterval = 15;

/// 本地缓存日志的最大条目数
final int flushBulkSize = 15;

完整示例代码

import 'dart:async';
import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:x_apm/x_apm.dart';
import 'package:x_apm_example/common/router.dart';
import 'package:x_apm_example/widgtes.dart';

GlobalKey<NavigatorState> globalKey = GlobalKey<NavigatorState>();

void main() {
  XApmManager.instance.init(
      config: ApmConfig(
          enable: true,
          handlers: [FloatWindowHandler(globalKey)],
          endpoint: 
              "https://hyperf.debug.591.com.hk/api/flutter/apm/save-record"));
  HttpOverrides.global = ApmHttpOverrides();

  XApm(appRunner: () => runApp(const MyApp()), ensureInitialized: true);
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      navigatorKey: globalKey,
      routes: generateRoutes(),
      theme: ThemeData(primarySwatch: Colors.blue, useMaterial3: false),
      navigatorObservers: [ApmNavigatorObserver.instance],
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('通用版首页'),
        actions: <Widget>[
          IconButton(
            icon: const Icon(Icons.settings),
            tooltip: 'Setting',
            onPressed: () => Navigator.of(context).pushNamed('/setting'),
          ),
        ],
      ),
      body: Center(
        child: ListView(
          padding: const EdgeInsets.only(left: 16.0, right: 16.0, top: 8.0, bottom: 8.0),
          children: <Widget>[
            buildEntryButton(context, '异常测试', '/error_test'),
            buildEntryButton(context, '页面路由跳转测试', '/navigator_test/first_page'),
            buildEntryButton(context, '设备信息', '/navigator_test/device_info_page'),
            buildEntryButton(context, '网络测试', '/navigator_test/network_page'),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


x_apm 是一个用于 Flutter 应用的性能监控插件,可以帮助开发者监控应用的性能指标,如 FPS(帧率)、内存使用、CPU 使用率、网络请求等。通过使用 x_apm,开发者可以更好地了解应用的性能瓶颈,并进行优化。

1. 安装 x_apm 插件

首先,你需要在 pubspec.yaml 文件中添加 x_apm 依赖:

dependencies:
  flutter:
    sdk: flutter
  x_apm: ^0.1.0  # 请根据实际情况使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化 x_apm

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

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

void main() {
  // 初始化 x_apm
  XApm.init();

  runApp(MyApp());
}

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

3. 监控性能指标

x_apm 提供了多种性能监控功能,你可以根据需要选择使用。

3.1 监控 FPS(帧率)

XApm.startFpsMonitor();

3.2 监控内存使用

XApm.startMemoryMonitor();

3.3 监控 CPU 使用率

XApm.startCpuMonitor();

3.4 监控网络请求

XApm.startNetworkMonitor();

4. 查看监控数据

你可以通过 XApm 提供的 API 来获取监控数据:

// 获取 FPS 数据
double fps = XApm.getFps();

// 获取内存使用数据
MemoryInfo memoryInfo = XApm.getMemoryInfo();

// 获取 CPU 使用率
double cpuUsage = XApm.getCpuUsage();

// 获取网络请求数据
List<NetworkInfo> networkInfoList = XApm.getNetworkInfo();

5. 停止监控

如果你不再需要监控,可以停止相应的监控功能:

XApm.stopFpsMonitor();
XApm.stopMemoryMonitor();
XApm.stopCpuMonitor();
XApm.stopNetworkMonitor();

6. 集成到开发工具

x_apm 还提供了与 Flutter 开发工具的集成功能,你可以将监控数据实时显示在 Flutter DevTools 中,方便调试和分析。

7. 注意事项

  • x_apm 是一个轻量级的性能监控工具,适合在开发和测试阶段使用。在生产环境中,建议根据实际需求选择合适的性能监控工具。
  • 使用 x_apm 时,注意监控的频率和范围,避免对应用性能产生过大的影响。

8. 示例代码

以下是一个完整的示例代码,展示了如何使用 x_apm 监控 FPS、内存、CPU 和网络请求:

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

void main() {
  XApm.init();
  runApp(MyApp());
}

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

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  double fps = 0;
  MemoryInfo memoryInfo = MemoryInfo();
  double cpuUsage = 0;
  List<NetworkInfo> networkInfoList = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    XApm.startFpsMonitor();
    XApm.startMemoryMonitor();
    XApm.startCpuMonitor();
    XApm.startNetworkMonitor();

    // 定时获取监控数据
    Timer.periodic(Duration(seconds: 1), (timer) {
      setState(() {
        fps = XApm.getFps();
        memoryInfo = XApm.getMemoryInfo();
        cpuUsage = XApm.getCpuUsage();
        networkInfoList = XApm.getNetworkInfo();
      });
    });
  }

  [@override](/user/override)
  void dispose() {
    XApm.stopFpsMonitor();
    XApm.stopMemoryMonitor();
    XApm.stopCpuMonitor();
    XApm.stopNetworkMonitor();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Performance Monitoring'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('FPS: ${fps.toStringAsFixed(2)}'),
            Text('Memory: ${memoryInfo.usedMemory} / ${memoryInfo.totalMemory}'),
            Text('CPU Usage: ${cpuUsage.toStringAsFixed(2)}%'),
            Text('Network Requests: ${networkInfoList.length}'),
          ],
        ),
      ),
    );
  }
}
回到顶部