Android中的资源泄漏

时间:2015-06-24 18:26:46

标签: java android file-descriptor parcel

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

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)

我能想到的唯一一件事就是我在浏览器中使用以下代码打开网址:

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语句:

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

它无法解析符号&#39; CloseGaurd&#39; libcore&#39;。 任何解决这个问题的方向都将非常感激。

1 个答案:

答案 0 :(得分:0)

这只是我对这个问题的研究报告 - 还不是答案。

最近在相关帖子中报告了此问题:例如,hereherehere

我有一个启用了BackupAgent的应用。当我最近启用StrictMode时,我开始看到此帖子和其他帖子中包含相同的CloseGuard异常,其中包括堆栈跟踪中的IBackupAgent。所以我认为我的BackupAgent出现了问题。

我看到我忽略了在BackupAgent的onBackup()方法中关闭ParcelFileDesciptors,所以添加了这些语句:

// 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表示&#34;它在进行Binder调用时确实跨越进程边界传播其状态&#34;。这表明应用程序的StrictMode设置可能比预期的要大。这些崩溃可能在任何时候启用StrictMode并发生备份时发生,并且可能不是由报告它们的应用程序代码引起的。