diff options
author | Christopher Tate <ctate@google.com> | 2017-06-16 13:14:48 -0700 |
---|---|---|
committer | Christopher Tate <ctate@google.com> | 2017-06-20 13:28:56 -0700 |
commit | 924afe2b0f721afa857a55c33da559f6efc41d32 (patch) | |
tree | fa7031d15af51b8a466b67e7c8d615d3f549803f /cmds | |
parent | 101ba665ddcd40de9f2fe51be910f03b90574a55 (diff) |
Add 'bmgr' command to synchronously init transports
bmgr init TRANSPORT [...]
will run an init operation on each named transport, blocking
until the operations have all completed.
Bug 62253989
Test: manual
Change-Id: I7dbd94293738d5ecf195764f5b28905253819791
Diffstat (limited to 'cmds')
-rw-r--r-- | cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java | 111 |
1 files changed, 93 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 1b77427c5b72..b61cdecbfb7b 100644 --- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java @@ -17,8 +17,8 @@ package com.android.commands.bmgr; import android.app.backup.BackupManager; -import android.app.backup.BackupManagerMonitor; import android.app.backup.BackupProgress; +import android.app.backup.BackupTransport; import android.app.backup.IBackupManager; import android.app.backup.IBackupObserver; import android.app.backup.IRestoreObserver; @@ -30,8 +30,11 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.SystemClock; import android.os.UserHandle; -import android.util.Log; +import android.util.ArraySet; + +import com.android.internal.annotations.GuardedBy; import java.util.ArrayList; import java.util.HashSet; @@ -97,6 +100,11 @@ public final class Bmgr { return; } + if ("init".equals(op)) { + doInit(); + return; + } + if ("list".equals(op)) { doList(); return; @@ -204,7 +212,7 @@ public final class Bmgr { System.out.println("Performing full transport backup"); String pkg; - ArrayList<String> allPkgs = new ArrayList<String>(); + ArraySet<String> allPkgs = new ArraySet<String>(); while ((pkg = nextArg()) != null) { allPkgs.add(pkg); } @@ -218,45 +226,77 @@ public final class Bmgr { } } - class BackupObserver extends IBackupObserver.Stub { - boolean done = false; + // IBackupObserver generically usable for any backup/init operation + abstract class Observer extends IBackupObserver.Stub { + private final Object trigger = new Object(); + + @GuardedBy("trigger") + private volatile boolean done = false; @Override public void onUpdate(String currentPackage, BackupProgress backupProgress) { - System.out.println( - "Package " + currentPackage + " with progress: " + backupProgress.bytesTransferred - + "/" + backupProgress.bytesExpected); } @Override public void onResult(String currentPackage, int status) { - System.out.println("Package " + currentPackage + " with result: " - + convertBackupStatusToString(status)); } @Override public void backupFinished(int status) { - System.out.println("Backup finished with result: " - + convertBackupStatusToString(status)); - synchronized (this) { + synchronized (trigger) { done = true; - this.notify(); + trigger.notify(); } } + public boolean done() { + return this.done; + } + + // Wait forever public void waitForCompletion() { + waitForCompletion(0); + } + + // Wait for a given time and then give up + public void waitForCompletion(long timeout) { // The backupFinished() callback will throw the 'done' flag; we // just sit and wait on that notification. - synchronized (this) { - while (!this.done) { + final long targetTime = SystemClock.elapsedRealtime() + timeout; + synchronized (trigger) { + // Wait until either we're done, or we've reached a stated positive timeout + while (!done && (timeout <= 0 || SystemClock.elapsedRealtime() < targetTime)) { try { - this.wait(); + trigger.wait(1000L); } catch (InterruptedException ex) { } } } } + } + + class BackupObserver extends Observer { + @Override + public void onUpdate(String currentPackage, BackupProgress backupProgress) { + super.onUpdate(currentPackage, backupProgress); + System.out.println( + "Package " + currentPackage + " with progress: " + backupProgress.bytesTransferred + + "/" + backupProgress.bytesExpected); + } + @Override + public void onResult(String currentPackage, int status) { + super.onResult(currentPackage, status); + System.out.println("Package " + currentPackage + " with result: " + + convertBackupStatusToString(status)); + } + + @Override + public void backupFinished(int status) { + super.backupFinished(status); + System.out.println("Backup finished with result: " + + convertBackupStatusToString(status)); + } } private static String convertBackupStatusToString(int errorCode) { @@ -349,7 +389,9 @@ public final class Bmgr { } else if (pkg.equals("--incremental")) { nonIncrementalBackup = false; } else { - allPkgs.add(pkg); + if (!allPkgs.contains(pkg)) { + allPkgs.add(pkg); + } } } if (backupAll) { @@ -470,6 +512,39 @@ public final class Bmgr { } } + class InitObserver extends Observer { + public int result = BackupTransport.TRANSPORT_ERROR; + + @Override + public void backupFinished(int status) { + super.backupFinished(status); + result = status; + } + } + + private void doInit() { + ArraySet<String> transports = new ArraySet<>(); + String transport; + while ((transport = nextArg()) != null) { + transports.add(transport); + } + if (transports.size() == 0) { + showUsage(); + return; + } + + InitObserver observer = new InitObserver(); + try { + System.out.println("Initializing transports: " + transports); + mBmgr.initializeTransports(transports.toArray(new String[transports.size()]), observer); + observer.waitForCompletion(30*1000L); + System.out.println("Initialization result: " + observer.result); + } 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)) { |