11

我相信已经成功安装了 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();
}

}

4

2 回答 2

10

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

不。

我怎么知道一切是否正常?

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

于 2016-12-31T18:40:48.787 回答
3

首先,检查您是否连接到调试器?LeakCanary 在调试时会忽略泄漏检测以避免误报。

其次,通过 Gradle 添加 LeakCanary,然后执行以下操作:

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 会报告内存泄漏,这可能需要一段时间......

于 2018-06-07T15:23:20.267 回答