Further development of backup file handling
Put backup data in flight into /cache
Close the files and delete the intermediates after backup pass
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index f5f3561..04cd53f 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -62,6 +62,7 @@
private final Object mQueueLock = new Object();
private File mStateDir;
+ private File mDataDir;
// ----- Handler that runs the actual backup process asynchronously -----
@@ -106,28 +107,41 @@
Log.d(TAG, "invoking doBackup() on " + backupIntent);
File savedStateName = new File(mStateDir, service.packageName);
- File backupDataName = new File(mStateDir, service.packageName + ".data");
+ File backupDataName = new File(mDataDir, service.packageName + ".data");
File newStateName = new File(mStateDir, service.packageName + ".new");
ParcelFileDescriptor savedState =
ParcelFileDescriptor.open(savedStateName,
ParcelFileDescriptor.MODE_READ_ONLY |
ParcelFileDescriptor.MODE_CREATE);
+
+ backupDataName.delete();
ParcelFileDescriptor backupData =
ParcelFileDescriptor.open(backupDataName,
ParcelFileDescriptor.MODE_READ_WRITE |
ParcelFileDescriptor.MODE_CREATE);
+
+ newStateName.delete();
ParcelFileDescriptor newState =
ParcelFileDescriptor.open(newStateName,
ParcelFileDescriptor.MODE_READ_WRITE |
ParcelFileDescriptor.MODE_CREATE);
- mTargetService.doBackup(savedState, backupData, newState);
+ // Run the target's backup pass
+ try {
+ mTargetService.doBackup(savedState, backupData, newState);
+ } finally {
+ savedState.close();
+ backupData.close();
+ newState.close();
+ }
// !!! TODO: Now propagate the newly-backed-up data to the transport
- // !!! TODO: After successful transport, juggle the files so that
- // next time the new state is used as the old state
+ // !!! TODO: After successful transport, delete the now-stale data
+ // and juggle the files so that next time the new state is passed
+ backupDataName.delete();
+ newStateName.renameTo(savedStateName);
} catch (FileNotFoundException fnf) {
Log.d(TAG, "File not found on backup: ");
@@ -173,9 +187,9 @@
mPackageManager = context.getPackageManager();
// Set up our bookkeeping
- File dataDir = Environment.getDataDirectory();
- mStateDir = new File(dataDir, "backup");
+ mStateDir = new File(Environment.getDataDirectory(), "backup");
mStateDir.mkdirs();
+ mDataDir = Environment.getDownloadCacheDirectory();
// Identify the backup participants
// !!! TODO: also watch package-install to keep this up to date