Как я могу исключить класс из LeakCanary? - PullRequest
0 голосов
/ 08 февраля 2019

Я делаю это:

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019
 /**
 * 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;
    }
}
0 голосов
/ 16 февраля 2019

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

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

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

...