summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poromov <poromov@google.com>2016-02-08 21:55:42 +0100
committerSergey Poromov <poromov@google.com>2016-02-10 00:08:02 +0000
commit10f0f712498b8c4b6308788d20027b35a8ce43a0 (patch)
tree4d17ca660a78f7385ab0054b69577bd68d4739ca
parent3b5a29cb5d2150a04db40fc176b283a339b9088d (diff)
Update bmgr tool.
Add support to QUOTA_EXCEEDED error output. Command "backupnow --all" without parameters now starts backup of all eligible packages. Change-Id: I563be35d575346d3dfb45a6dd254b387053c7ab7 (cherry picked from commit d5d68528bc7a7c1edb4691b5a40e37955128e73b)
-rw-r--r--cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java97
1 files changed, 79 insertions, 18 deletions
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
index 67d63a44a908..69b5a17300de 100644
--- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
+++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
@@ -23,11 +23,15 @@ import android.app.backup.IBackupManager;
import android.app.backup.IBackupObserver;
import android.app.backup.IRestoreObserver;
import android.app.backup.IRestoreSession;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageInfo;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.UserHandle;
import java.util.ArrayList;
import java.util.HashSet;
+import java.util.List;
public final class Bmgr {
IBackupManager mBmgr;
@@ -36,7 +40,9 @@ public final class Bmgr {
static final String BMGR_NOT_RUNNING_ERR =
"Error: Could not access the Backup Manager. Is the system running?";
static final String TRANSPORT_NOT_RUNNING_ERR =
- "Error: Could not access the backup transport. Is the system running?";
+ "Error: Could not access the backup transport. Is the system running?";
+ static final String PM_NOT_RUNNING_ERR =
+ "Error: Could not access the Package Manager. Is the system running?";
private String[] mArgs;
private int mNextArg;
@@ -203,19 +209,20 @@ public final class Bmgr {
@Override
public void onUpdate(String currentPackage, BackupProgress backupProgress) {
System.out.println(
- "onUpdate: " + currentPackage + " with progress: " + backupProgress.bytesTransferred
+ "Package " + currentPackage + " with progress: " + backupProgress.bytesTransferred
+ "/" + backupProgress.bytesExpected);
}
@Override
public void onResult(String currentPackage, int status) {
- System.out.println("onResult: " + currentPackage + " with result: "
+ System.out.println("Package " + currentPackage + " with result: "
+ convertBackupStatusToString(status));
}
@Override
public void backupFinished(int status) {
- System.out.println("backupFinished: " + convertBackupStatusToString(status));
+ System.out.println("Backup finished with result: "
+ + convertBackupStatusToString(status));
synchronized (this) {
done = true;
this.notify();
@@ -251,31 +258,83 @@ public final class Bmgr {
return "Transport rejected package";
case BackupManager.ERROR_AGENT_FAILURE:
return "Agent error";
+ case BackupManager.ERROR_TRANSPORT_QUOTA_EXCEEDED:
+ return "Size quota exceeded";
default:
return "Unknown error";
}
}
+ private void backupNowAllPackages() {
+ int userId = UserHandle.USER_SYSTEM;
+ IPackageManager mPm =
+ IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+ if (mPm == null) {
+ System.err.println(PM_NOT_RUNNING_ERR);
+ return;
+ }
+ List<PackageInfo> installedPackages = null;
+ try {
+ installedPackages = mPm.getInstalledPackages(0, userId).getList();
+ } catch (RemoteException e) {
+ System.err.println(e.toString());
+ System.err.println(PM_NOT_RUNNING_ERR);
+ }
+ if (installedPackages != null) {
+ List<String> packages = new ArrayList<>();
+ for (PackageInfo pi : installedPackages) {
+ try {
+ if (mBmgr.isAppEligibleForBackup(pi.packageName)) {
+ packages.add(pi.packageName);
+ }
+ } catch (RemoteException e) {
+ System.err.println(e.toString());
+ System.err.println(BMGR_NOT_RUNNING_ERR);
+ }
+ }
+ backupNowPackages(packages);
+ }
+ }
+
+ private void backupNowPackages(List<String> packages) {
+ try {
+ BackupObserver observer = new BackupObserver();
+ int err = mBmgr.requestBackup(packages.toArray(new String[packages.size()]), observer);
+ if (err == 0) {
+ // Off and running -- wait for the backup to complete
+ observer.waitForCompletion();
+ } else {
+ System.err.println("Unable to run backup");
+ }
+ } catch (RemoteException e) {
+ System.err.println(e.toString());
+ System.err.println(BMGR_NOT_RUNNING_ERR);
+ }
+ }
+
private void doBackupNow() {
String pkg;
+ boolean backupAll = false;
ArrayList<String> allPkgs = new ArrayList<String>();
while ((pkg = nextArg()) != null) {
- allPkgs.add(pkg);
+ if (pkg.equals("--all")) {
+ backupAll = true;
+ } else {
+ allPkgs.add(pkg);
+ }
}
- if (allPkgs.size() > 0) {
- try {
- BackupObserver observer = new BackupObserver();
- int err = mBmgr.requestBackup(allPkgs.toArray(new String[allPkgs.size()]), observer);
- if (err == 0) {
- // Off and running -- wait for the backup to complete
- observer.waitForCompletion();
- } else {
- System.err.println("Unable to run backup");
- }
- } catch (RemoteException e) {
- System.err.println(e.toString());
- System.err.println(BMGR_NOT_RUNNING_ERR);
+ if (backupAll) {
+ if (allPkgs.size() == 0) {
+ System.out.println("Running backup for all packages.");
+ backupNowAllPackages();
+ } else {
+ System.err.println("Provide only '--all' flag or list of packages.");
}
+ } else if (allPkgs.size() > 0) {
+ System.out.println("Running backup for " + allPkgs.size() +" requested packages.");
+ backupNowPackages(allPkgs);
+ } else {
+ System.err.println("Provide '--all' flag or list of packages.");
}
}
@@ -568,6 +627,7 @@ public final class Bmgr {
System.err.println(" bmgr run");
System.err.println(" bmgr wipe TRANSPORT PACKAGE");
System.err.println(" bmgr fullbackup PACKAGE...");
+ System.err.println(" bmgr backupnow --all|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");
@@ -620,6 +680,7 @@ public final class Bmgr {
System.err.println("packages. The data is sent via the currently active transport.");
System.err.println("");
System.err.println("The 'backupnow' command runs an immediate backup for one or more packages.");
+ System.err.println(" --all flag runs backup for all eligible packages.");
System.err.println("For each package it will run key/value or full data backup ");
System.err.println("depending on the package's manifest declarations.");
System.err.println("The data is sent via the currently active transport.");