我已经按照Data Backup的指南实施了BackupAgent。代码按预期运行,直到设置为检测泄漏的可关闭对象。执行备份并发生 GC 后,CloseGuard 报告此堆栈跟踪泄漏:StrictMode.VmPolicy
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;
}
此更改并未修复泄漏。
这些是我用来重现问题的步骤:
- 修改应用数据以触发调用
BackupManager.dataChanged()
- 用于
adb shell bmgr run
强制执行备份操作 - 启动 GC 从
Android Studio
我对绑定服务知之甚少,无法了解堆栈跟踪是否提供了有关泄漏是在系统中BackupService
还是由我看不到的代码中的错误引起的线索。使用存根运行时泄漏的持续发生onBackup()
向我表明泄漏正在服务中。
在研究这个问题时,我发现过去几个月发布的这些其他问题在他们的 : 中包含相同的泄漏报告logcats
:
Android - HTTP Get - 显式终止未称为错误。我错过了什么?
解决android中的java.lang.Throwable异常
上面显示的 logcat 来自 KitKat 设备。在另一台运行 Lollipop 的设备上,我认为发生了同样的错误。该应用程序被终止,但 logcat 不包括 CloseGuard 转储。不知道我需要做什么才能看到这一点。