我的 leakcanary 在工作吗?怎么知道?

Is my leakcanary working? How to know?

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

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

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

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

我 运行 我的应用程序在模拟器上,没有发现任何不同之处。我监视 Android 监视器,没有发现任何差异。我怎么知道是否一切正常?我已经分享了我的申请 class。

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();
}

}

Does my application class need to be explicitly called?

没有

How do I know if it's all working?

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

首先,请检查您是否连接到调试器? 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)
    }
}

在您的片段中(最好使用 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 片段打开 Activity 并用返回键关闭它。稍等一下,LeakCanary 将报告内存泄漏,这可能需要一段时间...