31

我正在尝试使用 LeakCanary 来检测我的应用程序中的内存泄漏,但它并没有比消息“转储内存,应用程序将冻结。Brrr”更进一步。我已经等了大约 20 分钟左右,但没有任何变化。这些设备上的行为相同:1. Asus fonepad 8(Android 5.0 stock)2. Sony Xperia SP(Android 5.1.1 CM 12.1 custom)3. HTC Desire C(Android 4.4 CM 11 custom)

我按照指示做了一切:

public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}
4

2 回答 2

42

如果您使用的是 Android M,则需要授予“写入外部存储”权限,否则泄漏金丝雀将与 brrr 消息一起挂起很长时间。在您的应用程序抽屉中,长按泄漏金丝雀的启动器(就像您要卸载它一样)并向上拖动到“应用程序信息”并打开存储权限。

于 2015-11-24T16:43:45.410 回答
-2

您应该将 RefWatcher 添加到您的片段中,就像项目页面上描述的一样:https ://github.com/square/leakcanary

LeakCanary.install()返回一个预配置的 RefWatcher。它还安装了一个 ActivityRefWatcher,它会在调用 Activity.onDestroy() 后自动检测活动是否泄漏。

public class ExampleApplication extends Application {

  public static RefWatcher getRefWatcher(Context context) {
    ExampleApplication application = (ExampleApplication) context.getApplicationContext();
    return application.refWatcher;
  }

  private RefWatcher refWatcher;

  @Override public void onCreate() {
    super.onCreate();
    refWatcher = LeakCanary.install(this);
  }
}

您可以使用 RefWatcher 来监视片段泄漏:

public abstract class BaseFragment extends Fragment {

  @Override public void onDestroy() {
    super.onDestroy();
    RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
    refWatcher.watch(this);
  }
}

此外,如果您想在发生内存泄漏时获取堆转储,只需从 Android Studio 中打开 Android 设备监视器,然后选择“文件资源管理器”选项卡。在目录 /mnt/shell/emulated/0/Download/leakcanary/detected_leaks 中,您将找到所有堆转储文件。

在此处输入图像描述

于 2015-07-30T14:57:15.600 回答