5

我已经按照Data Backup的指南实施了BackupAgent。代码按预期运行,直到设置为检测泄漏的可关闭对象。执行备份并发生 GC 后,CloseGuard 报告此堆栈跟踪泄漏:StrictMode.VmPolicyParcelFileDescriptor

06-28 21:47:39.683  25072-25081/com.qbix.nub 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:179)
            at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:905)
            at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:897)
            at android.app.IBackupAgent$Stub.onTransact(IBackupAgent.java:64)
            at android.os.Binder.execTransact(Binder.java:404)
            at dalvik.system.NativeStart.run(Native Method)
06-28 21:47:39.683  25072-25081/com.qbix.nub W/System.err﹕ StrictMode VmPolicy violation with POLICY_DEATH; shutting down.
06-28 21:47:39.683  25072-25081/com.qbix.nub I/Process﹕ Sending signal. PID: 25072 SIG: 9

为了确认我没有泄漏ParcelFileDescriptor我的BackupAgent,我像这样存根onBackup()

@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException {
    if (oldState != null) {
        oldState.close();
    }
    newState.close();
    return;
}

此更改并未修复泄漏。

这些是我用来重现问题的步骤:

  1. 修改应用数据以触发调用BackupManager.dataChanged()
  2. 用于adb shell bmgr run强制执行备份操作
  3. 启动 GC 从Android Studio

我对绑定服务知之甚少,无法了解堆栈跟踪是否提供了有关泄漏是在系统中BackupService还是由我看不到的代码中的错误引起的线索。使用存根运行时泄漏的持续发生onBackup()向我表明泄漏正在服务中。

在研究这个问题时,我发现过去几个月发布的这些其他问题在他们的 : 中包含相同的泄漏报告logcats

Android中的资源泄漏

Android中的导航抽屉有问题

Android - HTTP Get - 显式终止未称为错误。我错过了什么?

解决android中的java.lang.Throwable异常

上面显示的 logcat 来自 KitKat 设备。在另一台运行 Lollipop 的设备上,我认为发生了同样的错误。该应用程序被终止,但 logcat 不包括 CloseGuard 转储。不知道我需要做什么才能看到这一点。

4

0 回答 0