Flutter内存检测插件ume_kit_memory_detector的使用
Flutter内存检测插件ume_kit_memory_detector的使用
ume_kit_memory_detector 是一个用于自动以 Route 为单元进行内存泄漏检测的 Flutter 插件。(参赛作品)
使用
首先,在 MaterialApp 或 CupertinoApp 中添加 UmeKitMemoryDetector 到 navigatorObservers:
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();
}
更多使用方式
信息流监听
可以直接监听 UmeKitMemoryDetector 的 stream 来获取检测阶段及泄漏信息:
// 监听检测阶段
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
更多关于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'),
),
],
),
),
);
}
}

