diff options
| -rw-r--r-- | cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java | 26 | ||||
| -rw-r--r-- | services/java/com/android/server/BackupManagerService.java | 9 |
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(); |