我已根据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;
}
此更改并未修复泄漏。
这些是我用来重现问题的步骤:
BackupManager.dataChanged()
adb shell bmgr run
强制执行备份操作Android Studio
我不了解绑定服务,以了解堆栈跟踪是否提供有关泄漏是否在系统BackupService
中的线索,或者是由于我无法看到的代码中的错误引起的。使用短线onBackup()
运行时,泄漏的持续发生告诉我泄漏是在服务中。
在研究此问题时,我发现过去几个月发布的其他问题包括logcats
中的相同泄漏报告:
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转储。不知道我需要做什么才能看到。