暂无描述
内存泄漏检测工具
Flutter 内存泄漏检测工具
使用方法
初始化
为防止底层库 vm service 崩溃,请在添加内存泄漏检测对象前调用:
LeakDetector().init(maxRetainingPath: 300); //maxRetainingPath default is 300
启用泄漏检测会降低性能,且 Full GC 可能导致页面掉帧。
该功能由插件中的 assert 初始化,因此在 release 模式下构建时无需手动关闭。
检测方法
在 MaterialApp 的 navigatorObservers 中添加 LeakNavigatorObserver,它将自动检测页面 Widget 及其对应 Element 对象是否存在内存泄漏。若页面 Widget 为 StatefulWidget,其对应的 State 也会被自动检查。
import 'package:leak_detector/leak_detector.dart';
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorObservers: [
//used the LeakNavigatorObserver
LeakNavigatorObserver(
shouldCheck: (route) {
return route.settings.name != null && route.settings.name != '/';
},
),
],
);
}
获取泄漏信息
LeakDetector().onLeakedStream 可以注册你的监听器,并在检测到内存泄漏后通知对象的引用链。
LeakDetector().onEventStream 可以监听内部事件通知,例如 开始垃圾回收、结束垃圾回收 等。
提供了一个引用链的预览页面。你只需添加以下代码。注意,Bulid Context 必须能够获取到 NavigatorState:
import 'package:leak_detector/leak_detector.dart';
//show preview page
LeakDetector().onLeakedStream.listen((LeakedInfo info) {
//print to console
info.retainingPath.forEach((node) => print(node));
//show preview page
showLeakedInfoPage(navigatorKey.currentContext, info);
});
预览页面展示:



包含引用链节点的类信息、被引用属性信息、属性声明的源码以及源码位置(行号:列号)。
获取内存泄漏记录
import 'package:leak_detector/leak_detector.dart';
getLeakedRecording().then((List<LeakedInfo> infoList) {
showLeakedInfoListPage(navigatorKey.currentContext, infoList);
});

*真机无法连接 vm_service 的问题
VM 服务通过 Dart 开发服务(DDS)提供扩展功能集,该服务会将本文档描述的所有核心 VM 服务 RPC 转发至真正的 VM 服务。
因此当我们连接电脑运行时,电脑端的 DDS 会先连接我们手机端的 vm_service,导致我们的 leak_detector 插件无法再次连接 vm_service。
有两种解决方案:
-
运行完成后断开电脑连接,此时最好重启应用。
若手机安装的是已完成测试的包,则不存在上述问题,故该方法适合测试人员使用。
-
在
flutter run后添加--disable-dds参数关闭DDS。经测试,这不会对调试造成任何影响在
Android Studio中可按如下方式配置。
Pull Request #80900 合并后,--disable-dds 已更名为 --no-dds

