Merge "Add --monitor to bmgr backupnow"

This commit is contained in:
Bernardo Rufino
2018-08-09 13:33:20 +00:00
committed by Android (Google) Code Review

View File

@@ -16,10 +16,13 @@
package com.android.commands.bmgr;
import android.annotation.IntDef;
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.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
import android.app.backup.IRestoreObserver;
import android.app.backup.IRestoreSession;
@@ -28,6 +31,7 @@ import android.app.backup.RestoreSet;
import android.content.ComponentName;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
@@ -36,10 +40,13 @@ import android.util.ArraySet;
import com.android.internal.annotations.GuardedBy;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
public final class Bmgr {
@@ -247,7 +254,7 @@ public final class Bmgr {
}
// 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();
@GuardedBy("trigger")
@@ -295,7 +302,7 @@ public final class Bmgr {
}
}
class BackupObserver extends Observer {
private static class BackupObserver extends Observer {
@Override
public void onUpdate(String currentPackage, BackupProgress 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;
IPackageManager mPm =
IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
@@ -372,20 +379,27 @@ public final class Bmgr {
System.err.println(e.toString());
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;
if (nonIncrementalBackup) {
flags |= BackupManager.FLAG_NON_INCREMENTAL_BACKUP;
}
try {
BackupObserver observer = new BackupObserver();
// TODO: implement monitor here?
int err = mBmgr.requestBackup(packages.toArray(new String[packages.size()]), observer,
null, flags);
BackupMonitor monitor =
(monitorState != Monitor.OFF)
? new BackupMonitor(monitorState == Monitor.VERBOSE)
: null;
int err = mBmgr.requestBackup(
packages.toArray(new String[packages.size()]),
observer,
monitor,
flags);
if (err == 0) {
// Off and running -- wait for the backup to complete
observer.waitForCompletion();
@@ -402,6 +416,7 @@ public final class Bmgr {
String pkg;
boolean backupAll = false;
boolean nonIncrementalBackup = false;
@Monitor int monitor = Monitor.OFF;
ArrayList<String> allPkgs = new ArrayList<String>();
while ((pkg = nextArg()) != null) {
if (pkg.equals("--all")) {
@@ -410,6 +425,10 @@ public final class Bmgr {
nonIncrementalBackup = true;
} else if (pkg.equals("--incremental")) {
nonIncrementalBackup = false;
} else if (pkg.equals("--monitor")) {
monitor = Monitor.NORMAL;
} else if (pkg.equals("--monitor-verbose")) {
monitor = Monitor.VERBOSE;
} else {
if (!allPkgs.contains(pkg)) {
allPkgs.add(pkg);
@@ -420,14 +439,14 @@ public final class Bmgr {
if (allPkgs.size() == 0) {
System.out.println("Running " + (nonIncrementalBackup ? "non-" : "") +
"incremental backup for all packages.");
backupNowAllPackages(nonIncrementalBackup);
backupNowAllPackages(nonIncrementalBackup, monitor);
} else {
System.err.println("Provide only '--all' flag or list of packages.");
}
} else if (allPkgs.size() > 0) {
System.out.println("Running " + (nonIncrementalBackup ? "non-" : "") +
"incremental backup for " + allPkgs.size() +" requested packages.");
backupNowPackages(allPkgs, nonIncrementalBackup);
backupNowPackages(allPkgs, nonIncrementalBackup, monitor);
} else {
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 wipe TRANSPORT 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("");
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("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(" --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("depending on the package's manifest declarations.");
System.err.println("The data is sent via the currently active transport.");
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;
}
}