Merge "Add --monitor to bmgr backupnow"
This commit is contained in:
committed by
Android (Google) Code Review
commit
deee39507f
@@ -16,10 +16,13 @@
|
|||||||
|
|
||||||
package com.android.commands.bmgr;
|
package com.android.commands.bmgr;
|
||||||
|
|
||||||
|
import android.annotation.IntDef;
|
||||||
import android.app.backup.BackupManager;
|
import android.app.backup.BackupManager;
|
||||||
|
import android.app.backup.BackupManagerMonitor;
|
||||||
import android.app.backup.BackupProgress;
|
import android.app.backup.BackupProgress;
|
||||||
import android.app.backup.BackupTransport;
|
import android.app.backup.BackupTransport;
|
||||||
import android.app.backup.IBackupManager;
|
import android.app.backup.IBackupManager;
|
||||||
|
import android.app.backup.IBackupManagerMonitor;
|
||||||
import android.app.backup.IBackupObserver;
|
import android.app.backup.IBackupObserver;
|
||||||
import android.app.backup.IRestoreObserver;
|
import android.app.backup.IRestoreObserver;
|
||||||
import android.app.backup.IRestoreSession;
|
import android.app.backup.IRestoreSession;
|
||||||
@@ -28,6 +31,7 @@ import android.app.backup.RestoreSet;
|
|||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.pm.IPackageManager;
|
import android.content.pm.IPackageManager;
|
||||||
import android.content.pm.PackageInfo;
|
import android.content.pm.PackageInfo;
|
||||||
|
import android.os.Bundle;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
@@ -36,10 +40,13 @@ import android.util.ArraySet;
|
|||||||
|
|
||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
|
||||||
public final class Bmgr {
|
public final class Bmgr {
|
||||||
@@ -247,7 +254,7 @@ public final class Bmgr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// IBackupObserver generically usable for any backup/init operation
|
// IBackupObserver generically usable for any backup/init operation
|
||||||
abstract class Observer extends IBackupObserver.Stub {
|
private static abstract class Observer extends IBackupObserver.Stub {
|
||||||
private final Object trigger = new Object();
|
private final Object trigger = new Object();
|
||||||
|
|
||||||
@GuardedBy("trigger")
|
@GuardedBy("trigger")
|
||||||
@@ -295,7 +302,7 @@ public final class Bmgr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BackupObserver extends Observer {
|
private static class BackupObserver extends Observer {
|
||||||
@Override
|
@Override
|
||||||
public void onUpdate(String currentPackage, BackupProgress backupProgress) {
|
public void onUpdate(String currentPackage, BackupProgress backupProgress) {
|
||||||
super.onUpdate(currentPackage, backupProgress);
|
super.onUpdate(currentPackage, backupProgress);
|
||||||
@@ -347,7 +354,7 @@ public final class Bmgr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void backupNowAllPackages(boolean nonIncrementalBackup) {
|
private void backupNowAllPackages(boolean nonIncrementalBackup, @Monitor int monitorState) {
|
||||||
int userId = UserHandle.USER_SYSTEM;
|
int userId = UserHandle.USER_SYSTEM;
|
||||||
IPackageManager mPm =
|
IPackageManager mPm =
|
||||||
IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
|
IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
|
||||||
@@ -372,20 +379,27 @@ public final class Bmgr {
|
|||||||
System.err.println(e.toString());
|
System.err.println(e.toString());
|
||||||
System.err.println(BMGR_NOT_RUNNING_ERR);
|
System.err.println(BMGR_NOT_RUNNING_ERR);
|
||||||
}
|
}
|
||||||
backupNowPackages(Arrays.asList(filteredPackages), nonIncrementalBackup);
|
backupNowPackages(Arrays.asList(filteredPackages), nonIncrementalBackup, monitorState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void backupNowPackages(List<String> packages, boolean nonIncrementalBackup) {
|
private void backupNowPackages(
|
||||||
|
List<String> packages, boolean nonIncrementalBackup, @Monitor int monitorState) {
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
if (nonIncrementalBackup) {
|
if (nonIncrementalBackup) {
|
||||||
flags |= BackupManager.FLAG_NON_INCREMENTAL_BACKUP;
|
flags |= BackupManager.FLAG_NON_INCREMENTAL_BACKUP;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
BackupObserver observer = new BackupObserver();
|
BackupObserver observer = new BackupObserver();
|
||||||
// TODO: implement monitor here?
|
BackupMonitor monitor =
|
||||||
int err = mBmgr.requestBackup(packages.toArray(new String[packages.size()]), observer,
|
(monitorState != Monitor.OFF)
|
||||||
null, flags);
|
? new BackupMonitor(monitorState == Monitor.VERBOSE)
|
||||||
|
: null;
|
||||||
|
int err = mBmgr.requestBackup(
|
||||||
|
packages.toArray(new String[packages.size()]),
|
||||||
|
observer,
|
||||||
|
monitor,
|
||||||
|
flags);
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
// Off and running -- wait for the backup to complete
|
// Off and running -- wait for the backup to complete
|
||||||
observer.waitForCompletion();
|
observer.waitForCompletion();
|
||||||
@@ -402,6 +416,7 @@ public final class Bmgr {
|
|||||||
String pkg;
|
String pkg;
|
||||||
boolean backupAll = false;
|
boolean backupAll = false;
|
||||||
boolean nonIncrementalBackup = false;
|
boolean nonIncrementalBackup = false;
|
||||||
|
@Monitor int monitor = Monitor.OFF;
|
||||||
ArrayList<String> allPkgs = new ArrayList<String>();
|
ArrayList<String> allPkgs = new ArrayList<String>();
|
||||||
while ((pkg = nextArg()) != null) {
|
while ((pkg = nextArg()) != null) {
|
||||||
if (pkg.equals("--all")) {
|
if (pkg.equals("--all")) {
|
||||||
@@ -410,6 +425,10 @@ public final class Bmgr {
|
|||||||
nonIncrementalBackup = true;
|
nonIncrementalBackup = true;
|
||||||
} else if (pkg.equals("--incremental")) {
|
} else if (pkg.equals("--incremental")) {
|
||||||
nonIncrementalBackup = false;
|
nonIncrementalBackup = false;
|
||||||
|
} else if (pkg.equals("--monitor")) {
|
||||||
|
monitor = Monitor.NORMAL;
|
||||||
|
} else if (pkg.equals("--monitor-verbose")) {
|
||||||
|
monitor = Monitor.VERBOSE;
|
||||||
} else {
|
} else {
|
||||||
if (!allPkgs.contains(pkg)) {
|
if (!allPkgs.contains(pkg)) {
|
||||||
allPkgs.add(pkg);
|
allPkgs.add(pkg);
|
||||||
@@ -420,14 +439,14 @@ public final class Bmgr {
|
|||||||
if (allPkgs.size() == 0) {
|
if (allPkgs.size() == 0) {
|
||||||
System.out.println("Running " + (nonIncrementalBackup ? "non-" : "") +
|
System.out.println("Running " + (nonIncrementalBackup ? "non-" : "") +
|
||||||
"incremental backup for all packages.");
|
"incremental backup for all packages.");
|
||||||
backupNowAllPackages(nonIncrementalBackup);
|
backupNowAllPackages(nonIncrementalBackup, monitor);
|
||||||
} else {
|
} else {
|
||||||
System.err.println("Provide only '--all' flag or list of packages.");
|
System.err.println("Provide only '--all' flag or list of packages.");
|
||||||
}
|
}
|
||||||
} else if (allPkgs.size() > 0) {
|
} else if (allPkgs.size() > 0) {
|
||||||
System.out.println("Running " + (nonIncrementalBackup ? "non-" : "") +
|
System.out.println("Running " + (nonIncrementalBackup ? "non-" : "") +
|
||||||
"incremental backup for " + allPkgs.size() +" requested packages.");
|
"incremental backup for " + allPkgs.size() +" requested packages.");
|
||||||
backupNowPackages(allPkgs, nonIncrementalBackup);
|
backupNowPackages(allPkgs, nonIncrementalBackup, monitor);
|
||||||
} else {
|
} else {
|
||||||
System.err.println("Provide '--all' flag or list of packages.");
|
System.err.println("Provide '--all' flag or list of packages.");
|
||||||
}
|
}
|
||||||
@@ -824,7 +843,7 @@ public final class Bmgr {
|
|||||||
System.err.println(" bmgr run");
|
System.err.println(" bmgr run");
|
||||||
System.err.println(" bmgr wipe TRANSPORT PACKAGE");
|
System.err.println(" bmgr wipe TRANSPORT PACKAGE");
|
||||||
System.err.println(" bmgr fullbackup PACKAGE...");
|
System.err.println(" bmgr fullbackup PACKAGE...");
|
||||||
System.err.println(" bmgr backupnow --all|PACKAGE...");
|
System.err.println(" bmgr backupnow [--monitor|--monitor-verbose] --all|PACKAGE...");
|
||||||
System.err.println(" bmgr cancel backups");
|
System.err.println(" bmgr cancel backups");
|
||||||
System.err.println("");
|
System.err.println("");
|
||||||
System.err.println("The 'backup' command schedules a backup pass for the named package.");
|
System.err.println("The 'backup' command schedules a backup pass for the named package.");
|
||||||
@@ -878,9 +897,164 @@ public final class Bmgr {
|
|||||||
System.err.println("");
|
System.err.println("");
|
||||||
System.err.println("The 'backupnow' command runs an immediate backup for one or more packages.");
|
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(" --all flag runs backup for all eligible packages.");
|
||||||
|
System.err.println(" --monitor flag prints monitor events.");
|
||||||
|
System.err.println(" --monitor-verbose flag prints monitor events with all keys.");
|
||||||
System.err.println("For each package it will run key/value or full data backup ");
|
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("depending on the package's manifest declarations.");
|
||||||
System.err.println("The data is sent via the currently active transport.");
|
System.err.println("The data is sent via the currently active transport.");
|
||||||
System.err.println("The 'cancel backups' command cancels all running backups.");
|
System.err.println("The 'cancel backups' command cancels all running backups.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class BackupMonitor extends IBackupManagerMonitor.Stub {
|
||||||
|
private final boolean mVerbose;
|
||||||
|
|
||||||
|
private BackupMonitor(boolean verbose) {
|
||||||
|
mVerbose = verbose;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEvent(Bundle event) throws RemoteException {
|
||||||
|
StringBuilder out = new StringBuilder();
|
||||||
|
int id = event.getInt(BackupManagerMonitor.EXTRA_LOG_EVENT_ID);
|
||||||
|
int category = event.getInt(BackupManagerMonitor.EXTRA_LOG_EVENT_CATEGORY);
|
||||||
|
out.append("=> Event{").append(eventCategoryToString(category));
|
||||||
|
out.append(" / ").append(eventIdToString(id));
|
||||||
|
String packageName = event.getString(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_NAME);
|
||||||
|
if (packageName != null) {
|
||||||
|
out.append(" : package = ").append(packageName);
|
||||||
|
if (event.containsKey(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION)) {
|
||||||
|
long version =
|
||||||
|
event.getLong(
|
||||||
|
BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION);
|
||||||
|
out.append("(v").append(version).append(")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mVerbose) {
|
||||||
|
Set<String> remainingKeys = new ArraySet<>(event.keySet());
|
||||||
|
remainingKeys.remove(BackupManagerMonitor.EXTRA_LOG_EVENT_ID);
|
||||||
|
remainingKeys.remove(BackupManagerMonitor.EXTRA_LOG_EVENT_CATEGORY);
|
||||||
|
remainingKeys.remove(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_NAME);
|
||||||
|
remainingKeys.remove(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_LONG_VERSION);
|
||||||
|
remainingKeys.remove(BackupManagerMonitor.EXTRA_LOG_EVENT_PACKAGE_VERSION);
|
||||||
|
if (!remainingKeys.isEmpty()) {
|
||||||
|
out.append(", other keys =");
|
||||||
|
for (String key : remainingKeys) {
|
||||||
|
out.append(" ").append(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out.append("}");
|
||||||
|
System.out.println(out.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String eventCategoryToString(int eventCategory) {
|
||||||
|
switch (eventCategory) {
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT:
|
||||||
|
return "TRANSPORT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT:
|
||||||
|
return "AGENT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY:
|
||||||
|
return "BACKUP_MANAGER_POLICY";
|
||||||
|
default:
|
||||||
|
return "UNKNOWN_CATEGORY";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String eventIdToString(int eventId) {
|
||||||
|
switch (eventId) {
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_FULL_BACKUP_CANCEL:
|
||||||
|
return "FULL_BACKUP_CANCEL";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_ILLEGAL_KEY:
|
||||||
|
return "ILLEGAL_KEY";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_NO_DATA_TO_SEND:
|
||||||
|
return "NO_DATA_TO_SEND";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_INELIGIBLE:
|
||||||
|
return "PACKAGE_INELIGIBLE";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_KEY_VALUE_PARTICIPANT:
|
||||||
|
return "PACKAGE_KEY_VALUE_PARTICIPANT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_STOPPED:
|
||||||
|
return "PACKAGE_STOPPED";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_NOT_FOUND:
|
||||||
|
return "PACKAGE_NOT_FOUND";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_BACKUP_DISABLED:
|
||||||
|
return "BACKUP_DISABLED";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_DEVICE_NOT_PROVISIONED:
|
||||||
|
return "DEVICE_NOT_PROVISIONED";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_TRANSPORT_NOT_PRESENT:
|
||||||
|
return "PACKAGE_TRANSPORT_NOT_PRESENT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_ERROR_PREFLIGHT:
|
||||||
|
return "ERROR_PREFLIGHT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_QUOTA_HIT_PREFLIGHT:
|
||||||
|
return "QUOTA_HIT_PREFLIGHT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_EXCEPTION_FULL_BACKUP:
|
||||||
|
return "EXCEPTION_FULL_BACKUP";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_BACKUP_CANCEL:
|
||||||
|
return "KEY_VALUE_BACKUP_CANCEL";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_NO_RESTORE_METADATA_AVAILABLE:
|
||||||
|
return "NO_RESTORE_METADATA_AVAILABLE";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_NO_PM_METADATA_RECEIVED:
|
||||||
|
return "NO_PM_METADATA_RECEIVED";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_PM_AGENT_HAS_NO_METADATA:
|
||||||
|
return "PM_AGENT_HAS_NO_METADATA";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_LOST_TRANSPORT:
|
||||||
|
return "LOST_TRANSPORT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_NOT_PRESENT:
|
||||||
|
return "PACKAGE_NOT_PRESENT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_RESTORE_VERSION_HIGHER:
|
||||||
|
return "RESTORE_VERSION_HIGHER";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_APP_HAS_NO_AGENT:
|
||||||
|
return "APP_HAS_NO_AGENT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_SIGNATURE_MISMATCH:
|
||||||
|
return "SIGNATURE_MISMATCH";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_CANT_FIND_AGENT:
|
||||||
|
return "CANT_FIND_AGENT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_RESTORE_TIMEOUT:
|
||||||
|
return "KEY_VALUE_RESTORE_TIMEOUT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_RESTORE_ANY_VERSION:
|
||||||
|
return "RESTORE_ANY_VERSION";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_VERSIONS_MATCH:
|
||||||
|
return "VERSIONS_MATCH";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER:
|
||||||
|
return "VERSION_OF_BACKUP_OLDER";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_SIGNATURE_MISMATCH:
|
||||||
|
return "FULL_RESTORE_SIGNATURE_MISMATCH";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_SYSTEM_APP_NO_AGENT:
|
||||||
|
return "SYSTEM_APP_NO_AGENT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_ALLOW_BACKUP_FALSE:
|
||||||
|
return "FULL_RESTORE_ALLOW_BACKUP_FALSE";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_APK_NOT_INSTALLED:
|
||||||
|
return "APK_NOT_INSTALLED";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_CANNOT_RESTORE_WITHOUT_APK:
|
||||||
|
return "CANNOT_RESTORE_WITHOUT_APK";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_MISSING_SIGNATURE:
|
||||||
|
return "MISSING_SIGNATURE";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_EXPECTED_DIFFERENT_PACKAGE:
|
||||||
|
return "EXPECTED_DIFFERENT_PACKAGE";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_UNKNOWN_VERSION:
|
||||||
|
return "UNKNOWN_VERSION";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_TIMEOUT:
|
||||||
|
return "FULL_RESTORE_TIMEOUT";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_CORRUPT_MANIFEST:
|
||||||
|
return "CORRUPT_MANIFEST";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_WIDGET_METADATA_MISMATCH:
|
||||||
|
return "WIDGET_METADATA_MISMATCH";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_WIDGET_UNKNOWN_VERSION:
|
||||||
|
return "WIDGET_UNKNOWN_VERSION";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_NO_PACKAGES:
|
||||||
|
return "NO_PACKAGES";
|
||||||
|
case BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_IS_NULL:
|
||||||
|
return "TRANSPORT_IS_NULL";
|
||||||
|
default:
|
||||||
|
return "UNKNOWN_ID";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@IntDef({Monitor.OFF, Monitor.NORMAL, Monitor.VERBOSE})
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
private @interface Monitor {
|
||||||
|
int OFF = 0;
|
||||||
|
int NORMAL = 1;
|
||||||
|
int VERBOSE = 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user