summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java26
-rw-r--r--services/java/com/android/server/BackupManagerService.java9
2 files changed, 35 insertions, 0 deletions
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
index c90b8622b833..ee3ec1aa18fb 100644
--- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
+++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
@@ -97,6 +97,11 @@ public final class Bmgr {
return;
}
+ if ("wipe".equals(op)) {
+ doWipe();
+ return;
+ }
+
System.err.println("Unknown command");
showUsage();
}
@@ -183,6 +188,22 @@ public final class Bmgr {
}
}
+ private void doWipe() {
+ String pkg = nextArg();
+ if (pkg == null) {
+ showUsage();
+ return;
+ }
+
+ try {
+ mBmgr.clearBackupData(pkg);
+ System.out.println("Wiped backup data for " + pkg);
+ } catch (RemoteException e) {
+ System.err.println(e.toString());
+ System.err.println(BMGR_NOT_RUNNING_ERR);
+ }
+ }
+
private void doList() {
String arg = nextArg(); // sets, transports, packages set#
if ("transports".equals(arg)) {
@@ -343,6 +364,7 @@ public final class Bmgr {
System.err.println(" bmgr transport WHICH");
System.err.println(" bmgr restore TOKEN");
System.err.println(" bmgr run");
+ System.err.println(" bmgr wipe PACKAGE");
System.err.println("");
System.err.println("The 'backup' command schedules a backup pass for the named package.");
System.err.println("Note that the backup pass will effectively be a no-op if the package");
@@ -373,5 +395,9 @@ public final class Bmgr {
System.err.println("The 'run' command causes any scheduled backup operation to be initiated");
System.err.println("immediately, without the usual waiting period for batching together");
System.err.println("data changes.");
+ System.err.println("");
+ System.err.println("The 'wipe' command causes all backed-up data for the given package to be");
+ System.err.println("erased from the current transport's storage. The next backup operation");
+ System.err.println("that the given application performs will rewrite its entire data set.");
}
}
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index c3b91577dd19..7977d1f33b15 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -943,6 +943,15 @@ class BackupManagerService extends IBackupManager.Stub {
mPackageManager, agentPackages);
processOneRestore(omPackage, 0, IBackupAgent.Stub.asInterface(pmAgent.onBind()));
+ // Verify that the backup set includes metadata. If not, we can't do
+ // signature/version verification etc, so we simply do not proceed with
+ // the restore operation.
+ Metadata pmMeta = pmAgent.getRestoredMetadata(packageName);
+ if (pmMeta == null) {
+ Log.i(TAG, "No restore metadata available, so not restoring settings");
+ return;
+ }
+
int count = 0;
for (;;) {
packageName = mTransport.nextRestorePackage();