Android 如何从LeakCanary中排除类?
我正在这样做:Android 如何从LeakCanary中排除类?,android,leakcanary,Android,Leakcanary,我正在这样做: ExcludedRefs excludedRefs = AndroidExcludedRefs.createAppDefaults() .clazz("androidx.lifecycle.ReportFragment") .reason("Very annoying report fragment leak that isn't a leak apparently") .always
ExcludedRefs excludedRefs = AndroidExcludedRefs.createAppDefaults()
.clazz("androidx.lifecycle.ReportFragment")
.reason("Very annoying report fragment leak that isn't a leak apparently")
.alwaysExclude()
.build();
LeakCanary
.refWatcher(context)
.listenerServiceClass(DisplayLeakService.class)
.excludedRefs(excludedRefs)
.watchDelay(10, TimeUnit.SECONDS)
.buildAndInstall();
然而,我仍然得到报告片段从未进行过GCed,但没有发现泄漏
我的一项活动也得到了这个消息,我不知道如何处理这些no leak found
消息
编辑:当前使用LeakCanary 1.6.3我发现了这个;我想我可以试试 这是预期的工作。 在执行堆转储和分析之前,我们无法知道是否排除了泄漏。完成此操作后,默认行为是以[Excluded]作为前缀显示通知。这让用户知道泄漏的金丝雀已经完成。若并没有任何反馈,你们就并没有办法知道是否泄漏了金丝雀。这可以说是一种比完全没有反馈更好的用户体验
您可以通过提供自己的com.squareup.leakcanary.AbstractAnalysisResultService子类而不是使用默认的com.squareup.leakcanary.DisplayLeakService来定制此行为尝试此链接我实际上开始认为我不应该阻止它,因为它只是显示给我的类,但我的
活动
是扩展它。我的主要测试手机通常从不向我显示泄漏跟踪,但我在另一部手机上尝试过,它看起来像我的一个活动正在泄漏。该活动中有一些后台任务,这就是它泄漏的原因
/**
* Excluding known memory leaks from third party libraries
* @return
*/
protected RefWatcher installLeakCanary() {
if (LeakCanary.isInAnalyzerProcess(this)) {
return RefWatcher.DISABLED;
} else {
// IGNORE References: Update or add reference class and context name in instanceField
ExcludedRefs excludedRefs = AndroidExcludedRefs.createAppDefaults()
.instanceField("com.example.third.party.TheirClassOne", "context")
.instanceField("com.example.third.party.TheirClassTwo", "context")
.build();
LeakCanary.enableDisplayLeakActivity(this);
ServiceHeapDumpListener heapDumpListener = new ServiceHeapDumpListener(this, DisplayLeakService.class);
final RefWatcher refWatcher = LeakCanary.androidWatcher(this, heapDumpListener, excludedRefs);
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivityDestroyed(Activity activity) {
//IGNORE Activities: Update or add the class name here to ingore the memory leaks from those actvities
if (activity instanceof ThirdPartyOneActivity) return;
if (activity instanceof ThirdPartyTwoActivity) return;
if (activity instanceof ThirdPartyThreeActivity) return;
refWatcher.watch(activity);
}
@Override
public void onActivityResumed(Activity activity) {
}
});
return refWatcher;
}
}