ParcelFileDescriptor Leak发生在哪里?

时间:2015-06-29 05:38:19

标签: android android-backup-service android-strictmode

我已根据BackupAgent的指南实施了Data Backup。在将StrictMode.VmPolicy设置为检测泄漏的可关闭对象之前,代码的行为与预期一致。执行备份并发生GC后,CloseGuard会报告此堆栈跟踪泄露ParcelFileDescriptor

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. 的调用
  3. 使用adb shell bmgr run强制执行备份操作
  4. Android Studio
  5. 发起GC

    我不了解绑定服务,以了解堆栈跟踪是否提供有关泄漏是否在系统BackupService中的线索,或者是由于我无法看到的代码中的错误引起的。使用短线onBackup()运行时,泄漏的持续发生告诉我泄漏是在服务中。

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

    Resource leak in Android

    Having problems With navigation Drawer in Android

    Android - HTTP Get - Explicit Termination not called error. What am I missing?

    Resolving java.lang.Throwable exception in an android

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

0 个答案:

没有答案