Skip to content Skip to sidebar Skip to footer

How To Ignore Certain Classes From Leakcanary?

Can someone give me a working example of how to ignoring certain classes from LeakCanary? I was looking at this example for ignoring certain classes from third party library in Lea

Solution 1:

Thanks to CommonsWare, calling the methods and variables on LeakCanary works. Here is a complete example for ignoring certain References or Activities in LeakCanary. Look at the comments: IGNORE Rreferences and IGNORE Activities.

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import com.squareup.leakcanary.AndroidExcludedRefs;
import com.squareup.leakcanary.DisplayLeakService;
import com.squareup.leakcanary.ExcludedRefs;
import com.squareup.leakcanary.LeakCanary;
import com.squareup.leakcanary.RefWatcher;
import com.squareup.leakcanary.ServiceHeapDumpListener;

public class MyApplication extends Application {

    // LeakCanary for memory leak detection
    private RefWatcher refWatcher;
    public static RefWatcher getRefWatcher(Context context) {
        MyApplication application = (MyApplication) context.getApplicationContext();
        return application.refWatcher;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        refWatcher = installLeakCanary();
    }


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

}

Post a Comment for "How To Ignore Certain Classes From Leakcanary?"