我正在做这个:
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();
但我还是拿到了ReportFragment was never GCed but no leak found
。
我的一项活动也是如此,我不知道如何处理这些no leak found
消息。
编辑:当前使用LeakCanary 1.6.3
发布于 2019-02-17 01:33:00
我找到了这个;我想我可以试试
这和预期的一样工作。在执行堆转储和分析之前,我们不能知道是否排除了泄漏。一旦我们这样做了,默认行为是显示一个前缀为Excluded的通知。这让用户知道LeakCanary已经完成了。如果根本没有反馈,您将无法知道是否完成了泄漏金丝雀。这可以说是一种比根本没有反馈更好的用户体验。
您可以通过提供自己的com.squareup.leakcanary.AbstractAnalysisResultService子类而不是使用缺省的com.squareup.leakcanary.DisplayLeakService来自定义此行为
发布于 2019-02-18 21:02:31
/**
* 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;
}
}
https://stackoverflow.com/questions/54598742
复制相似问题