首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从LeakCanary中排除类?

如何从LeakCanary中排除类?
EN

Stack Overflow用户
提问于 2019-02-09 03:04:11
回答 2查看 1.3K关注 0票数 5

我正在做这个:

代码语言:javascript
运行
复制
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

EN

回答 2

Stack Overflow用户

发布于 2019-02-17 01:33:00

我找到了这个;我想我可以试试

这和预期的一样工作。在执行堆转储和分析之前,我们不能知道是否排除了泄漏。一旦我们这样做了,默认行为是显示一个前缀为Excluded的通知。这让用户知道LeakCanary已经完成了。如果根本没有反馈,您将无法知道是否完成了泄漏金丝雀。这可以说是一种比根本没有反馈更好的用户体验。

您可以通过提供自己的com.squareup.leakcanary.AbstractAnalysisResultService子类而不是使用缺省的com.squareup.leakcanary.DisplayLeakService来自定义此行为

票数 0
EN

Stack Overflow用户

发布于 2019-02-18 21:02:31

代码语言:javascript
运行
复制
 /**
 * 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;
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54598742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档