【问题标题】:Is my leakcanary working? How to know?我的泄漏工作正常吗?怎么知道?
【发布时间】:2017-05-15 14:35:47
【问题描述】:

我相信已经成功安装了 LeakCanary。

我将调试、发布和测试依赖项添加到 build.gradle 文件中。

我将必要的文件添加到我的应用程序类中。根据需要导入。确认应用程序类已正确添加到清单。我的应用程序类是否需要显式调用?

<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"

我在模拟器上运行我的应用程序并没有看到任何不同。我监控 Android Monitor 并没有看到任何区别。我怎么知道一切是否正常?我已经分享了我的应用程序类。

import android.app.Application;
import android.content.res.Configuration;
import com.squareup.leakcanary.LeakCanary;

public class MyApplication extends Application {

@Override
public void onCreate() {
    super.onCreate();

    if (LeakCanary.isInAnalyzerProcess(this)) {
        return;
    }
    LeakCanary.install(this);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

@Override
public void onLowMemory() {
    super.onLowMemory();
}

}

【问题讨论】:

    标签: android memory-leaks leakcanary


    【解决方案1】:

    我的应用程序类是否需要显式调用?

    没有。

    我如何知道一切是否正常?

    故意泄露一些东西。例如,将您的启动器活动实例分配给 static 字段。

    【讨论】:

    • 我试过了,但也许我做错了。我搜索了常见的内存泄漏并尝试了这两个。不用找了。我一定做错了什么。如果它工作正常,我应该从泄漏金丝雀中看到什么?
    • @seeking_stillness:“我用谷歌搜索了常见的内存泄漏并尝试了这两个”——LeakCanary 没有检测到开箱即用的任意内存泄漏。它唯一会自动检测到的是泄露的活动。这就是为什么我建议您通过将一个活动分配给static 字段来泄漏活动。 “如果它工作正常,我应该从泄漏金丝雀中看到什么?” -- 一个activity被销毁后(比如你按下BACK),几秒后,如果LeakCanary认为你销毁的activity被泄露了,你会看到自定义的Toast出现,表示LeakCanary正在dump堆。
    • @seeking_stillness:然后,大约一分钟后,如果有泄漏,您应该会在状态栏中看到 Notification
    • 状态栏中的通知
    【解决方案2】:

    首先,检查您是否连接到调试器? LeakCanary ignores leak detection when debugging 避免误报。

    其次,Add the LeakCanary via Gradle 然后执行以下操作:

    class App : Application() {
    
        companion object {
            @JvmStatic
            fun getRefWatcher(context: Context): RefWatcher {
                val applicationContext = context.applicationContext as App
                return applicationContext.refWatcher
            }
        }
    
        private lateinit var refWatcher: RefWatcher
    
        override fun onCreate() {
            super.onCreate()
            if (LeakCanary.isInAnalyzerProcess(this)) {
                // This process is dedicated to LeakCanary for heap analysis.
                // You should not init your app in this process.
                return;
            }
            refWatcher = LeakCanary.install(this)
        }
    }
    

    在您的 Fragment 中(最好使用 BaseFragment)

    override fun onDestroy() {
    
       if (BuildConfig.DEBUG) {
          activity?.let {
             App.getRefWatcher(it).watch(this)
          }
          super.onDestroy()
    }
    

    然后在你的一个带有片段的子活动中做:

    class MemLeakFragment : BaseFragment() {
    
        companion object {
            @JvmStatic
            lateinit var memleak: Activity
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            activity?.let {
                memleak = it
            }
        }
    }
    

    使用memleak Fragment 打开 Activity,然后按一下将其关闭。稍等一下,LeakCanary 会报告内存泄漏,这可能需要一段时间...

    【讨论】:

    • toWatch 来自哪里?
    • 对不起,我使用 LifecycleObserver 来处理生命周期。我更新了答案。
    • @Paul,我应该等几个小时甚至更长时间吗?
    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2023-01-27
    相关资源
    最近更新 更多