summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
Diffstat (limited to 'services')
-rw-r--r--services/java/com/android/server/BackupManagerService.java43
1 files changed, 24 insertions, 19 deletions
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 776de7e..854a6f9 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -887,8 +887,12 @@ class BackupManagerService extends IBackupManager.Stub {
mPackageManager, allAgentPackages());
BackupRequest pmRequest = new BackupRequest(new ApplicationInfo(), false);
pmRequest.appInfo.packageName = PACKAGE_MANAGER_SENTINEL;
- processOneBackup(pmRequest,
- IBackupAgent.Stub.asInterface(pmAgent.onBind()), mTransport);
+
+ // If we haven't stored anything yet, we need to do an init
+ // operation along with recording the metadata blob.
+ boolean needInit = (mEverStoredApps.size() == 0);
+ processOneBackup(pmRequest, IBackupAgent.Stub.asInterface(pmAgent.onBind()),
+ mTransport, needInit);
// Now run all the backups in our queue
int count = mQueue.size();
@@ -934,7 +938,7 @@ class BackupManagerService extends IBackupManager.Stub {
try {
agent = bindToAgentSynchronous(request.appInfo, mode);
if (agent != null) {
- processOneBackup(request, agent, transport);
+ processOneBackup(request, agent, transport, false);
}
// unbind even on timeout, just in case
@@ -950,9 +954,9 @@ class BackupManagerService extends IBackupManager.Stub {
}
void processOneBackup(BackupRequest request, IBackupAgent agent,
- IBackupTransport transport) {
+ IBackupTransport transport, boolean doInit) {
final String packageName = request.appInfo.packageName;
- if (DEBUG) Log.d(TAG, "processOneBackup doBackup() on " + packageName);
+ if (DEBUG) Log.d(TAG, "processOneBackup doBackup(" + doInit + ") on " + packageName);
File savedStateName = new File(mStateDir, packageName);
File backupDataName = new File(mDataDir, packageName + ".data");
@@ -962,12 +966,6 @@ class BackupManagerService extends IBackupManager.Stub {
ParcelFileDescriptor backupData = null;
ParcelFileDescriptor newState = null;
- // Usually we won't force a server-side init, except the first time
- // we ever back up following enable of backup. To keep the bookkeeping
- // simple, we detect this here rather than maintain state throughout
- // the backup manager.
- boolean doInit = false;
-
PackageInfo packInfo;
try {
// Look up the package info & signatures. This is first so that if it
@@ -977,13 +975,6 @@ class BackupManagerService extends IBackupManager.Stub {
// The metadata 'package' is synthetic
packInfo = new PackageInfo();
packInfo.packageName = packageName;
-
- // if there's no metadata backup state, this must be the
- // first time we've done one since enabling it.
- if (savedStateName.exists() == false) {
- if (DEBUG) Log.i(TAG, "First backup pass, issuing init");
- doInit = true;
- }
} else {
packInfo = mPackageManager.getPackageInfo(packageName,
PackageManager.GET_SIGNATURES);
@@ -1400,7 +1391,21 @@ class BackupManagerService extends IBackupManager.Stub {
agent.doRestore(backupData, appVersionCode, newState);
// if everything went okay, remember the recorded state now
- newStateName.renameTo(savedStateName);
+ //
+ // !!! TODO: the restored data should be migrated on the server
+ // side into the current dataset. In that case the new state file
+ // we just created would reflect the data already extant in the
+ // backend, so there'd be nothing more to do. Until that happens,
+ // however, we need to make sure that we record the data to the
+ // current backend dataset. (Yes, this means shipping the data over
+ // the wire in both directions. That's bad, but consistency comes
+ // first, then efficiency.) Once we introduce server-side data
+ // migration to the newly-restored device's dataset, we will change
+ // the following from a discard of the newly-written state to the
+ // "correct" operation of renaming into the canonical state blob.
+ newStateName.delete(); // TODO: remove; see above comment
+ //newStateName.renameTo(savedStateName); // TODO: replace with this
+
int size = (int) backupDataName.length();
EventLog.writeEvent(RESTORE_PACKAGE_EVENT, packageName, size);
} catch (Exception e) {