summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chris Tate <ctate@android.com> 2010-02-08 16:30:35 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2010-02-08 16:30:35 -0800
commit960f5d42223fc7636dc8182911ea0af9fea97a0f (patch)
tree4725660e3170b22ea5e27f5dd68e3b7e02d784d7
parent7499ef3e68e920c07e990deb600ceb6cf9b0c4c2 (diff)
parentb49ceb3b8b17656984fd969d548dc912e7d2c7c1 (diff)
Merge "Remember which apps have available restore info in the ancestral dataset"
-rw-r--r--services/java/com/android/server/BackupManagerService.java55
-rw-r--r--services/java/com/android/server/PackageManagerBackupAgent.java15
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.