【问题标题】:Resource leak in AndroidAndroid中的资源泄漏
【发布时间】:2015-06-24 18:26:46
【问题描述】:

我已经开发了几个星期的安卓应用程序,并且时不时地看到这个问题:

06-24 14:04:48.915    1530-1539/android.process.acore E/StrictMode﹕ A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
        at dalvik.system.CloseGuard.open(CloseGuard.java:184)
        at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:180)
        at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:916)
        at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:906)
        at android.app.IBackupAgent$Stub.onTransact(IBackupAgent.java:57)
        at android.os.Binder.execTransact(Binder.java:446)

我能想到的唯一原因是我使用以下代码在浏览器中打开了一个 url:

ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(View textView) {
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.practiceadmin.com/legal/"));
        browserIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        startActivity(browserIntent);

    }
};

奇怪的是,当我打开我的 android.os.ParcelFileDescriptor.java 文件时,它对导入语句说:

import dalvik.system.CloseGuard;
import libcore.io.IoUtils;
import libcore.io.Memory;

它无法解析符号“CloseGaurd”/“libcore”。 任何解决此问题的方向将不胜感激。

【问题讨论】:

标签: java android file-descriptor parcel


【解决方案1】:

这只是我对该问题的研究报告——还没有答案。

这个问题最近在相关帖子中被报告过:例如hereherehere

我有一个启用了 BackupAgent 的应用程序。当我最近启用 StrictMode 时,我开始在这篇文章和其他文章中看到相同的 CloseGuard 异常,其中包括堆栈跟踪中的 IBackupAgent。所以我认为我的 BackupAgent 有问题。

我发现我忽略了在 BackupAgent 的 onBackup() 方法中关闭 ParcelFileDescriptors,因此添加了以下语句:

// if there is no prior state, oldState is null
if (oldState != null) {
    oldState.close();
}
newState.close();

即使进行了此更改,随机异常仍然存在。然后我注意到,在有关该问题的其他一些报告中,OP 是新的 Android 开发人员,可能尚未为他们的应用程序创建 BackupAgent。这让我怀疑资源泄漏是在 BackupService 的框架代码中,或者是由其他应用程序中的 BackupAgents 引起的。 this crash 的 logcat 显示 DictionaryBackupAgent 处于活动状态。

我不太了解应用组件的 StrickMode 设置的传播程度。 StrictMode documentation 表示“在进行 Binder 调用时,它确实会跨进程边界传播其状态”。这表明应用的 StrictMode 设置可能比预期的要大。这些崩溃可能会在启用 StrictMode 并进行备份时发生,并且可能不是由报告它们的应用程序的代码引起的。

【讨论】:

  • 我专门为泄漏创建了一个issue——还没有回复。我越来越确信泄漏是在系统备份服务中,解决它的唯一方法是更改​​您的 StrictMode 设置以记录泄漏而不是使应用程序崩溃。
猜你喜欢
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2020-12-09
相关资源
最近更新 更多