Flutter内存检测插件ume_kit_memory_detector的使用

Flutter内存检测插件ume_kit_memory_detector的使用

ume_kit_memory_detector 是一个用于自动以 Route 为单元进行内存泄漏检测的 Flutter 插件。(参赛作品)

使用

首先,在 MaterialAppCupertinoApp 中添加 UmeKitMemoryDetectornavigatorObservers

MaterialApp(
  navigatorObservers: [
    UmeKitMemoryDetector(), // 添加内存检测观察器
  ],
  home: MyHomePage(),
)

(非必须)可以将 MemoryDetectorButton 添加到任意位置,建议使用悬浮窗:

WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
  entry = OverlayEntry(builder: (_) => const MemoryDetectorButton());
  Overlay.of(context)?.insert(entry!);
});

默认情况下,泄漏信息会通过 LeakedInfoDbRecorder 写入到数据库,并可以通过它来获取所存储的泄露信息。

// 其父类
/// 泄露信息记录器
abstract class LeakedInfoRecorder {

  /// 添加一条记录
  void add(LeakedInfo info);

  /// 批量添加记录
  void addAll(List<LeakedInfo> list);

  /// 根据id删除一条记录
  void deleteById(int id);

  /// 清除所有记录
  void clear();

  /// 获取所有记录
  Future<List<LeakedInfo>> getAll();
}

更多使用方式

信息流监听

可以直接监听 UmeKitMemoryDetectorstream 来获取检测阶段及泄漏信息:

// 监听检测阶段
UmeKitMemoryDetector().taskPhaseStream.listen((phase) {
  print('当前检测阶段: $phase');
});

// 监听泄漏信息
UmeKitMemoryDetector().infoStream.listen((leakInfo) {
  print('检测到泄漏信息: ${leakInfo.description}');
});

自定义对象检测

通过以下方法可以添加任意待检测对象:

// key需要是唯一的
// 添加一个待检测对象
UmeKitMemoryDetector().addObject(obj: leaker, group: key);

// 开始检测
UmeKitMemoryDetector().doDetect(key);

自定义泄露信息存储方式

默认通过 LeakedInfoDbRecorder 写入到数据库,也可以覆盖 defaultHandler 来调整输出位置:

// 自定义记录器
LeakedRecordHandler defaultHandler = YourRecorder().add;

class YourRecorder implements LeakedInfoRecorder {

  [@override](/user/override)
  void add(LeakedInfo info) {
    // 自定义存储逻辑
  }

  [@override](/user/override)
  void addAll(List<LeakedInfo> list) {
    // 批量存储逻辑
  }

  [@override](/user/override)
  void deleteById(int id) {
    // 删除指定ID的记录
  }

  [@override](/user/override)
  void clear() {
    // 清空所有记录
  }

  [@override](/user/override)
  Future<List<LeakedInfo>> getAll() async {
    // 获取所有记录
    return [];
  }
}

自定义检测属性

可以通过以下字段,调整检测属性:

/// 引用链最大长度
/// * 见 [VmService.getRetainingPath]
const int maxRetainingPath = int.fromEnvironment("maxRetainingPath", defaultValue: 400);

/// 强制关闭内存检测
const bool closeMemDetector = bool.fromEnvironment("closeMemDetector", defaultValue: false);

/// 延迟检测
/// * 单位 : 毫秒
/// * 部分对象并不会及时回收
const int delayDoDetect = int.fromEnvironment('delayDoDetect', defaultValue: 800);

/// 扩展单元数量
/// * 在gc前创建[expandUnitNumber]个对象,用于触发full gc
/// * 0则不创建。
/// * 在实际项目接入中,由于项目所占用的内存,默认值可能过大,建议根据需求调整。
const int expandUnitNumber = int.fromEnvironment('expandUnitNumber', defaultValue: 10000000);

高度自定义

如果以上无法满足需求,可以直接继承 MemoryDetector:

class YourCustomDetector extends MemoryDetector {
  [@override](/user/override)
  void onTaskStart() {
    // 自定义任务开始逻辑
  }

  [@override](/user/override)
  void onTaskEnd() {
    // 自定义任务结束逻辑
  }

  [@override](/user/override)
  void onLeakDetected(LeakedInfo info) {
    // 自定义泄漏检测逻辑
  }
}

完整示例Demo

以下是一个完整的示例,展示如何使用 ume_kit_memory_detector 插件进行内存泄漏检测:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Memory Leak Detection Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      navigatorObservers: [
        UmeKitMemoryDetector(), // 添加内存检测观察器
      ],
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  late OverlayEntry entry;

  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
      entry = OverlayEntry(builder: (_) => const MemoryDetectorButton());
      Overlay.of(context)?.insert(entry);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('内存泄漏检测'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 添加待检测对象
            UmeKitMemoryDetector().addObject(
              obj: this,
              group: 'HomePage',
            );

            // 开始检测
            UmeKitMemoryDetector().doDetect('HomePage');
          },
          child: Text('检测内存泄漏'),
        ),
      ),
    );
  }
}

更多关于Flutter内存检测插件ume_kit_memory_detector的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter内存检测插件ume_kit_memory_detector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


ume_kit_memory_detector 是一个用于 Flutter 应用的内存检测插件,它可以帮助开发者在开发过程中监控应用的内存使用情况,从而发现潜在的内存泄漏或内存使用不合理的地方。以下是如何使用 ume_kit_memory_detector 的详细步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 ume_kit_memory_detector 的依赖:

dependencies:
  flutter:
    sdk: flutter
  ume_kit_memory_detector: ^1.0.0  # 请使用最新版本

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

2. 初始化插件

在你的 main.dart 文件中,初始化 ume_kit_memory_detector 插件。通常,你可以在 main 函数中进行初始化。

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化内存检测插件
  UmeKitMemoryDetector().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 StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Memory Detector Example'),
      ),
      body: Center(
        child: Text('Hello, Memory Detector!'),
      ),
    );
  }
}

3. 使用内存检测功能

ume_kit_memory_detector 提供了多种内存检测功能,包括内存快照、内存泄漏检测等。你可以在应用的任何地方调用这些功能。

3.1 手动触发内存快照

你可以在需要的时候手动触发内存快照,以便查看当前的内存使用情况。

UmeKitMemoryDetector().takeSnapshot();

3.2 自动内存泄漏检测

你可以启用自动内存泄漏检测,插件会自动检测潜在的内存泄漏。

UmeKitMemoryDetector().enableLeakDetection();

3.3 查看内存信息

你可以通过调用 getMemoryInfo 方法来获取当前的内存信息。

var memoryInfo = await UmeKitMemoryDetector().getMemoryInfo();
print(memoryInfo);

4. 查看检测结果

ume_kit_memory_detector 通常会将检测结果输出到控制台。你可以在调试过程中查看这些日志,以便分析内存使用情况。

5. 调试和优化

根据 ume_kit_memory_detector 提供的信息,你可以分析应用的内存使用情况,找出潜在的内存泄漏或不合理的内存使用,并进行相应的优化。

6. 注意事项

  • ume_kit_memory_detector 主要用于调试阶段,不建议在正式发布的应用中使用。
  • 内存检测可能会对应用的性能产生一定的影响,因此建议在需要时启用,并在调试完成后关闭。

7. 示例代码

以下是一个完整的示例代码,展示了如何使用 ume_kit_memory_detector

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化内存检测插件
  UmeKitMemoryDetector().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 StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Memory Detector Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Hello, Memory Detector!'),
            ElevatedButton(
              onPressed: () {
                // 手动触发内存快照
                UmeKitMemoryDetector().takeSnapshot();
              },
              child: Text('Take Memory Snapshot'),
            ),
            ElevatedButton(
              onPressed: () {
                // 启用自动内存泄漏检测
                UmeKitMemoryDetector().enableLeakDetection();
              },
              child: Text('Enable Leak Detection'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部