坚持"倾倒记忆,app会冻结.Brrr." 信息

Ser*_*lov 30 android memory-leaks leakcanary

我正在尝试使用LeakCanary来检测我的应用程序中的内存泄漏,但它没有比消息"倾倒内存,应用程序将冻结.Brrr."更进一步.我已经等了大约20分钟左右,但没有变化.在这些设备上的行为相同:1.华硕fonepad 8(Android 5.0股票)2.索尼Xperia SP(Android 5.1.1 CM 12.1自定义)3.HTC Desire C(Android 4.4 CM 11自定义)

我在教学中做了一切建议:

public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}
Run Code Online (Sandbox Code Playgroud)

bsa*_*ner 42

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

  • @bsautner这是在Leakcanary的`1.4-beta1`版本中修复的.[处理M上的存储权限](https://github.com/square/leakcanary/commit/ea0af1d6be08ba4ac7eda913219456286ab0c4f8):`当检测到潜在的泄漏时,如果缺少存储权限,我们会丢失泄漏并显示通知.然后该通知将显示权限对话框 (4认同)
  • Android M正慢慢成为我存在的祸根.我甚至没有怀疑这会是问题,但事实确实如此.在GitHub上存在一个未解决的问题,所以希望它在未来的版本中得到修复. (3认同)

小智 -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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

public abstract class BaseFragment extends Fragment {

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

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

在此输入图像描述

  • 抱歉,如果我误会了……OP 没有提到任何关于片段的具体内容。对于他们的情况(也是我的情况),我们所做的就是将 `LeakCanary.install(this)` 行放入 `Application#onCreate()` 方法中。 (3认同)