diff options
| author | 2010-02-08 16:30:35 -0800 | |
|---|---|---|
| committer | 2010-02-08 16:30:35 -0800 | |
| commit | 960f5d42223fc7636dc8182911ea0af9fea97a0f (patch) | |
| tree | 4725660e3170b22ea5e27f5dd68e3b7e02d784d7 | |
| parent | 7499ef3e68e920c07e990deb600ceb6cf9b0c4c2 (diff) | |
| parent | b49ceb3b8b17656984fd969d548dc912e7d2c7c1 (diff) | |
Merge "Remember which apps have available restore info in the ancestral dataset"
| -rw-r--r-- | services/java/com/android/server/BackupManagerService.java | 55 | ||||
| -rw-r--r-- | services/java/com/android/server/PackageManagerBackupAgent.java | 15 |
2 files changed, 64 insertions, 6 deletions
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index 24187a5893b0..27055edadfe1 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -76,6 +76,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Random; +import java.util.Set; class BackupManagerService extends IBackupManager.Stub { private static final String TAG = "BackupManagerService"; @@ -226,7 +227,9 @@ class BackupManagerService extends IBackupManager.Stub { private File mEverStored; HashSet<String> mEverStoredApps = new HashSet<String>(); + static final int CURRENT_ANCESTRAL_RECORD_VERSION = 1; // increment when the schema changes File mTokenFile; + Set<String> mAncestralPackages = null; long mAncestralToken = 0; long mCurrentToken = 0; @@ -500,8 +503,20 @@ class BackupManagerService extends IBackupManager.Stub { mTokenFile = new File(mBaseStateDir, "ancestral"); try { RandomAccessFile tf = new RandomAccessFile(mTokenFile, "r"); - mAncestralToken = tf.readLong(); - mCurrentToken = tf.readLong(); + int version = tf.readInt(); + if (version == CURRENT_ANCESTRAL_RECORD_VERSION) { + mAncestralToken = tf.readLong(); + mCurrentToken = tf.readLong(); + + int numPackages = tf.readInt(); + if (numPackages >= 0) { + mAncestralPackages = new HashSet<String>(); + for (int i = 0; i < numPackages; i++) { + String pkgName = tf.readUTF(); + mAncestralPackages.add(pkgName); + } + } + } } catch (IOException e) { Log.w(TAG, "Unable to read token file", e); } @@ -972,12 +987,31 @@ class BackupManagerService extends IBackupManager.Stub { } } - // Record the current and ancestral backup tokens persistently + // Persistently record the current and ancestral backup tokens as well + // as the set of packages with data [supposedly] available in the + // ancestral dataset. void writeRestoreTokens() { try { RandomAccessFile af = new RandomAccessFile(mTokenFile, "rwd"); + + // First, the version number of this record, for futureproofing + af.writeInt(CURRENT_ANCESTRAL_RECORD_VERSION); + + // Write the ancestral and current tokens af.writeLong(mAncestralToken); af.writeLong(mCurrentToken); + + // Now write the set of ancestral packages + if (mAncestralPackages == null) { + af.writeInt(-1); + } else { + af.writeInt(mAncestralPackages.size()); + if (DEBUG) Log.v(TAG, "Ancestral packages: " + mAncestralPackages.size()); + for (String pkgName : mAncestralPackages) { + af.writeUTF(pkgName); + if (DEBUG) Log.v(TAG, " " + pkgName); + } + } af.close(); } catch (IOException e) { Log.w(TAG, "Unable to write token file:", e); @@ -1502,6 +1536,7 @@ class BackupManagerService extends IBackupManager.Stub { * the user is waiting, after all. */ + PackageManagerBackupAgent pmAgent = null; int error = -1; // assume error // build the set of apps to restore @@ -1562,7 +1597,7 @@ class BackupManagerService extends IBackupManager.Stub { } // Pull the Package Manager metadata from the restore set first - PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent( + pmAgent = new PackageManagerBackupAgent( mPackageManager, agentPackages); processOneRestore(omPackage, 0, IBackupAgent.Stub.asInterface(pmAgent.onBind())); @@ -1705,8 +1740,10 @@ class BackupManagerService extends IBackupManager.Stub { } // If this was a restoreAll operation, record that this was our - // ancestral dataset - if (mTargetPackage == null) { + // ancestral dataset, as well as the set of apps that are possibly + // restoreable from the dataset + if (mTargetPackage == null && pmAgent != null) { + mAncestralPackages = pmAgent.getRestoredPackages(); mAncestralToken = mToken; writeRestoreTokens(); } @@ -2436,6 +2473,12 @@ class BackupManagerService extends IBackupManager.Stub { } } + pw.println("Ancestral packages: " + + (mAncestralPackages == null ? "none" : mAncestralPackages.size())); + for (String pkg : mAncestralPackages) { + pw.println(" " + pkg); + } + pw.println("Ever backed up: " + mEverStoredApps.size()); for (String pkg : mEverStoredApps) { pw.println(" " + pkg); diff --git a/services/java/com/android/server/PackageManagerBackupAgent.java b/services/java/com/android/server/PackageManagerBackupAgent.java index dbd18264af08..9551db5d6a93 100644 --- a/services/java/com/android/server/PackageManagerBackupAgent.java +++ b/services/java/com/android/server/PackageManagerBackupAgent.java @@ -40,6 +40,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Set; /** * We back up the signatures of each package so that during a system restore, @@ -100,6 +101,20 @@ public class PackageManagerBackupAgent extends BackupAgent { return mRestoredSignatures.get(packageName); } + + public Set<String> getRestoredPackages() { + if (mRestoredSignatures == null) { + Log.w(TAG, "getRestoredPackages() before metadata read!"); + return null; + } + + // This is technically the set of packages on the originating handset + // that had backup agents at all, not limited to the set of packages + // that had actually contributed a restore dataset, but it's a + // close enough approximation for our purposes and does not require any + // additional involvement by the transport to obtain. + return mRestoredSignatures.keySet(); + } // The backed up data is the signature block for each app, keyed by // the package name. |