Как я могу исключить класс из LeakCanary?

77
8

Я делаю это:

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

спросил(а) 2021-01-25T20:42:57+03:00 4 месяца, 3 недели назад
1
Решение
89

 /**
* 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;
}
}

ответил(а) 2021-01-25T20:42:57+03:00 4 месяца, 3 недели назад
45

Я нашел это; Я думал, что могу попробовать

Это работает, как ожидалось. Мы не можем знать, исключена ли утечка до выполнения дампа кучи и анализа. Как только мы это сделаем, стандартным поведением будет отображение уведомления с [Исключено] в качестве префикса. Это позволяет пользователям знать, что LeakCanary готов. Если бы не было никакой обратной связи вообще, у вас не было бы никакого способа узнать, сделана канарейка утечки или нет. Возможно, это лучший пользовательский опыт, чем отсутствие обратной связи вообще.

Вы можете настроить это поведение, предоставив свой собственный подкласс com.squareup.leakcanary.AbstractAnalysisResultService вместо использования по умолчанию com.squareup.leakcanary.DisplayLeakService.

ответил(а) 2021-01-25T20:42:57+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема