Loading cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +79 −46 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.commands.bmgr; import android.annotation.IntDef; import android.annotation.UserIdInt; import android.app.backup.BackupManager; import android.app.backup.BackupManagerMonitor; import android.app.backup.BackupProgress; Loading @@ -29,6 +30,7 @@ import android.app.backup.IRestoreSession; import android.app.backup.ISelectBackupTransportCallback; import android.app.backup.RestoreSet; import android.content.ComponentName; import android.content.Context; import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.os.Bundle; Loading @@ -37,8 +39,10 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserHandle; import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; Loading @@ -49,20 +53,34 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CountDownLatch; public final class Bmgr { IBackupManager mBmgr; IRestoreSession mRestore; /** * Adb shell command for {@link android.app.backup.IBackupManager}. */ public class Bmgr { public static final String TAG = "Bmgr"; private final IBackupManager mBmgr; private IRestoreSession mRestore; static final String BMGR_NOT_RUNNING_ERR = private 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 = private static final String TRANSPORT_NOT_RUNNING_ERR = "Error: Could not access the backup transport. Is the system running?"; static final String PM_NOT_RUNNING_ERR = private static final String PM_NOT_RUNNING_ERR = "Error: Could not access the Package Manager. Is the system running?"; private String[] mArgs; private int mNextArg; @VisibleForTesting Bmgr(IBackupManager bmgr) { mBmgr = bmgr; } Bmgr() { mBmgr = IBackupManager.Stub.asInterface(ServiceManager.getService(Context.BACKUP_SERVICE)); } public static void main(String[] args) { try { new Bmgr().run(args); Loading @@ -78,71 +96,73 @@ public final class Bmgr { return; } if (!isBmgrActive()) { mArgs = args; mNextArg = 0; int userId = parseUserId(); String op = nextArg(); Slog.v(TAG, "Running " + op + " for user:" + userId); if (!isBmgrActive(userId)) { return; } mArgs = args; String op = args[0]; mNextArg = 1; if ("enabled".equals(op)) { doEnabled(); doEnabled(userId); return; } if ("enable".equals(op)) { doEnable(); doEnable(userId); return; } if ("run".equals(op)) { doRun(); doRun(userId); return; } if ("backup".equals(op)) { doBackup(); doBackup(userId); return; } if ("init".equals(op)) { doInit(); doInit(userId); return; } if ("list".equals(op)) { doList(); doList(userId); return; } if ("restore".equals(op)) { doRestore(); doRestore(userId); return; } if ("transport".equals(op)) { doTransport(); doTransport(userId); return; } if ("wipe".equals(op)) { doWipe(); doWipe(userId); return; } if ("fullbackup".equals(op)) { doFullTransportBackup(); doFullTransportBackup(userId); return; } if ("backupnow".equals(op)) { doBackupNow(); doBackupNow(userId); return; } if ("cancel".equals(op)) { doCancel(); doCancel(userId); return; } Loading @@ -155,15 +175,14 @@ public final class Bmgr { showUsage(); } private boolean isBmgrActive() { mBmgr = IBackupManager.Stub.asInterface(ServiceManager.getService("backup")); boolean isBmgrActive(@UserIdInt int userId) { if (mBmgr == null) { System.err.println(BMGR_NOT_RUNNING_ERR); return false; } try { if (!mBmgr.isBackupServiceActive(UserHandle.USER_SYSTEM)) { if (!mBmgr.isBackupServiceActive(userId)) { System.err.println(BMGR_NOT_RUNNING_ERR); return false; } Loading @@ -180,7 +199,7 @@ public final class Bmgr { return enabled ? "enabled" : "disabled"; } private void doEnabled() { private void doEnabled(@UserIdInt int userId) { try { boolean isEnabled = mBmgr.isBackupEnabled(); System.out.println("Backup Manager currently " Loading @@ -191,7 +210,7 @@ public final class Bmgr { } } private void doEnable() { private void doEnable(@UserIdInt int userId) { String arg = nextArg(); if (arg == null) { showUsage(); Loading @@ -211,7 +230,7 @@ public final class Bmgr { } } private void doRun() { void doRun(@UserIdInt int userId) { try { mBmgr.backupNow(); } catch (RemoteException e) { Loading @@ -220,7 +239,7 @@ public final class Bmgr { } } private void doBackup() { private void doBackup(@UserIdInt int userId) { String pkg = nextArg(); if (pkg == null) { showUsage(); Loading @@ -235,7 +254,7 @@ public final class Bmgr { } } private void doFullTransportBackup() { private void doFullTransportBackup(@UserIdInt int userId) { System.out.println("Performing full transport backup"); String pkg; Loading Loading @@ -354,8 +373,8 @@ public final class Bmgr { } } private void backupNowAllPackages(boolean nonIncrementalBackup, @Monitor int monitorState) { int userId = UserHandle.USER_SYSTEM; private void backupNowAllPackages(@UserIdInt int userId, boolean nonIncrementalBackup, @Monitor int monitorState) { IPackageManager mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); if (mPm == null) { Loading @@ -379,11 +398,13 @@ public final class Bmgr { System.err.println(e.toString()); System.err.println(BMGR_NOT_RUNNING_ERR); } backupNowPackages(Arrays.asList(filteredPackages), nonIncrementalBackup, monitorState); backupNowPackages(userId, Arrays.asList(filteredPackages), nonIncrementalBackup, monitorState); } } private void backupNowPackages( @UserIdInt int userId, List<String> packages, boolean nonIncrementalBackup, @Monitor int monitorState) { int flags = 0; if (nonIncrementalBackup) { Loading Loading @@ -412,7 +433,7 @@ public final class Bmgr { } } private void doBackupNow() { private void doBackupNow(@UserIdInt int userId) { String pkg; boolean backupAll = false; boolean nonIncrementalBackup = false; Loading @@ -439,20 +460,20 @@ public final class Bmgr { if (allPkgs.size() == 0) { System.out.println("Running " + (nonIncrementalBackup ? "non-" : "") + "incremental backup for all packages."); backupNowAllPackages(nonIncrementalBackup, monitor); backupNowAllPackages(userId, 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, monitor); backupNowPackages(userId, allPkgs, nonIncrementalBackup, monitor); } else { System.err.println("Provide '--all' flag or list of packages."); } } private void doCancel() { private void doCancel(@UserIdInt int userId) { String arg = nextArg(); if ("backups".equals(arg)) { try { Loading @@ -467,7 +488,7 @@ public final class Bmgr { System.err.println("Unknown command."); } private void doTransport() { private void doTransport(@UserIdInt int userId) { try { String which = nextArg(); if (which == null) { Loading Loading @@ -531,7 +552,7 @@ public final class Bmgr { } } private void doWipe() { private void doWipe(@UserIdInt int userId) { String transport = nextArg(); if (transport == null) { showUsage(); Loading Loading @@ -563,7 +584,7 @@ public final class Bmgr { } } private void doInit() { private void doInit(@UserIdInt int userId) { ArraySet<String> transports = new ArraySet<>(); String transport; while ((transport = nextArg()) != null) { Loading @@ -586,7 +607,7 @@ public final class Bmgr { } } private void doList() { private void doList(@UserIdInt int userId) { String arg = nextArg(); // sets, transports, packages set# if ("transports".equals(arg)) { doListTransports(); Loading @@ -603,8 +624,6 @@ public final class Bmgr { if ("sets".equals(arg)) { doListRestoreSets(); } else if ("transports".equals(arg)) { doListTransports(); } mRestore.endRestoreSession(); Loading Loading @@ -717,7 +736,7 @@ public final class Bmgr { } } private void doRestore() { private void doRestore(@UserIdInt int userId) { String arg = nextArg(); if (arg == null) { showUsage(); Loading Loading @@ -830,8 +849,18 @@ public final class Bmgr { return arg; } private int parseUserId() { String arg = nextArg(); if ("--user".equals(arg)) { return UserHandle.parseUserArg(nextArg()); } else { mNextArg--; return UserHandle.USER_SYSTEM; } } private static void showUsage() { System.err.println("usage: bmgr [backup|restore|list|transport|run]"); System.err.println("usage: bmgr [--user <userId>] [backup|restore|list|transport|run]"); System.err.println(" bmgr backup PACKAGE"); System.err.println(" bmgr enable BOOL"); System.err.println(" bmgr enabled"); Loading @@ -847,6 +876,10 @@ public final class Bmgr { System.err.println(" bmgr cancel backups"); System.err.println(" bmgr init TRANSPORT..."); System.err.println(""); System.err.println("The '--user' option specifies the user on which the operation is run."); System.err.println("It must be the first argument before the operation."); System.err.println("The default value is 0 which is the system user."); 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"); System.err.println("does not actually have changed data to store."); Loading services/robotests/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_PRIVILEGED_MODULE := true LOCAL_STATIC_JAVA_LIBRARIES := \ bmgrlib \ services.backup \ services.core \ services.net Loading services/robotests/src/com/android/commands/bmgr/BmgrTest.java 0 → 100644 +63 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.commands.bmgr; import static org.mockito.Mockito.verify; import android.app.backup.IBackupManager; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link com.android.commands.bmgr.Bmgr}. */ @RunWith(RobolectricTestRunner.class) @Presubmit public class BmgrTest { @Mock private IBackupManager mBackupManager; private Bmgr mBmgr; /** Common setup run before each test method. */ @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mBmgr = new Bmgr(mBackupManager); } /** * Test that bmgr uses the default user {@link UserHandle.USER_SYSTEM} if no user is specified. */ @Test public void testRun_whenUserNotSpecified_callsBackupManagerAsSystemUser() throws Exception { mBmgr.run(new String[] {"run"}); verify(mBackupManager).isBackupServiceActive(UserHandle.USER_SYSTEM); } /** Test that bmgr uses the specified user if an user is specified. */ @Test public void testRun_whenUserSpecified_callsBackupManagerAsSpecifiedUser() throws Exception { mBmgr.run(new String[] {"--user", "10"}); verify(mBackupManager).isBackupServiceActive(10); } } Loading
cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +79 −46 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.commands.bmgr; import android.annotation.IntDef; import android.annotation.UserIdInt; import android.app.backup.BackupManager; import android.app.backup.BackupManagerMonitor; import android.app.backup.BackupProgress; Loading @@ -29,6 +30,7 @@ import android.app.backup.IRestoreSession; import android.app.backup.ISelectBackupTransportCallback; import android.app.backup.RestoreSet; import android.content.ComponentName; import android.content.Context; import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.os.Bundle; Loading @@ -37,8 +39,10 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserHandle; import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; Loading @@ -49,20 +53,34 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CountDownLatch; public final class Bmgr { IBackupManager mBmgr; IRestoreSession mRestore; /** * Adb shell command for {@link android.app.backup.IBackupManager}. */ public class Bmgr { public static final String TAG = "Bmgr"; private final IBackupManager mBmgr; private IRestoreSession mRestore; static final String BMGR_NOT_RUNNING_ERR = private 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 = private static final String TRANSPORT_NOT_RUNNING_ERR = "Error: Could not access the backup transport. Is the system running?"; static final String PM_NOT_RUNNING_ERR = private static final String PM_NOT_RUNNING_ERR = "Error: Could not access the Package Manager. Is the system running?"; private String[] mArgs; private int mNextArg; @VisibleForTesting Bmgr(IBackupManager bmgr) { mBmgr = bmgr; } Bmgr() { mBmgr = IBackupManager.Stub.asInterface(ServiceManager.getService(Context.BACKUP_SERVICE)); } public static void main(String[] args) { try { new Bmgr().run(args); Loading @@ -78,71 +96,73 @@ public final class Bmgr { return; } if (!isBmgrActive()) { mArgs = args; mNextArg = 0; int userId = parseUserId(); String op = nextArg(); Slog.v(TAG, "Running " + op + " for user:" + userId); if (!isBmgrActive(userId)) { return; } mArgs = args; String op = args[0]; mNextArg = 1; if ("enabled".equals(op)) { doEnabled(); doEnabled(userId); return; } if ("enable".equals(op)) { doEnable(); doEnable(userId); return; } if ("run".equals(op)) { doRun(); doRun(userId); return; } if ("backup".equals(op)) { doBackup(); doBackup(userId); return; } if ("init".equals(op)) { doInit(); doInit(userId); return; } if ("list".equals(op)) { doList(); doList(userId); return; } if ("restore".equals(op)) { doRestore(); doRestore(userId); return; } if ("transport".equals(op)) { doTransport(); doTransport(userId); return; } if ("wipe".equals(op)) { doWipe(); doWipe(userId); return; } if ("fullbackup".equals(op)) { doFullTransportBackup(); doFullTransportBackup(userId); return; } if ("backupnow".equals(op)) { doBackupNow(); doBackupNow(userId); return; } if ("cancel".equals(op)) { doCancel(); doCancel(userId); return; } Loading @@ -155,15 +175,14 @@ public final class Bmgr { showUsage(); } private boolean isBmgrActive() { mBmgr = IBackupManager.Stub.asInterface(ServiceManager.getService("backup")); boolean isBmgrActive(@UserIdInt int userId) { if (mBmgr == null) { System.err.println(BMGR_NOT_RUNNING_ERR); return false; } try { if (!mBmgr.isBackupServiceActive(UserHandle.USER_SYSTEM)) { if (!mBmgr.isBackupServiceActive(userId)) { System.err.println(BMGR_NOT_RUNNING_ERR); return false; } Loading @@ -180,7 +199,7 @@ public final class Bmgr { return enabled ? "enabled" : "disabled"; } private void doEnabled() { private void doEnabled(@UserIdInt int userId) { try { boolean isEnabled = mBmgr.isBackupEnabled(); System.out.println("Backup Manager currently " Loading @@ -191,7 +210,7 @@ public final class Bmgr { } } private void doEnable() { private void doEnable(@UserIdInt int userId) { String arg = nextArg(); if (arg == null) { showUsage(); Loading @@ -211,7 +230,7 @@ public final class Bmgr { } } private void doRun() { void doRun(@UserIdInt int userId) { try { mBmgr.backupNow(); } catch (RemoteException e) { Loading @@ -220,7 +239,7 @@ public final class Bmgr { } } private void doBackup() { private void doBackup(@UserIdInt int userId) { String pkg = nextArg(); if (pkg == null) { showUsage(); Loading @@ -235,7 +254,7 @@ public final class Bmgr { } } private void doFullTransportBackup() { private void doFullTransportBackup(@UserIdInt int userId) { System.out.println("Performing full transport backup"); String pkg; Loading Loading @@ -354,8 +373,8 @@ public final class Bmgr { } } private void backupNowAllPackages(boolean nonIncrementalBackup, @Monitor int monitorState) { int userId = UserHandle.USER_SYSTEM; private void backupNowAllPackages(@UserIdInt int userId, boolean nonIncrementalBackup, @Monitor int monitorState) { IPackageManager mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); if (mPm == null) { Loading @@ -379,11 +398,13 @@ public final class Bmgr { System.err.println(e.toString()); System.err.println(BMGR_NOT_RUNNING_ERR); } backupNowPackages(Arrays.asList(filteredPackages), nonIncrementalBackup, monitorState); backupNowPackages(userId, Arrays.asList(filteredPackages), nonIncrementalBackup, monitorState); } } private void backupNowPackages( @UserIdInt int userId, List<String> packages, boolean nonIncrementalBackup, @Monitor int monitorState) { int flags = 0; if (nonIncrementalBackup) { Loading Loading @@ -412,7 +433,7 @@ public final class Bmgr { } } private void doBackupNow() { private void doBackupNow(@UserIdInt int userId) { String pkg; boolean backupAll = false; boolean nonIncrementalBackup = false; Loading @@ -439,20 +460,20 @@ public final class Bmgr { if (allPkgs.size() == 0) { System.out.println("Running " + (nonIncrementalBackup ? "non-" : "") + "incremental backup for all packages."); backupNowAllPackages(nonIncrementalBackup, monitor); backupNowAllPackages(userId, 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, monitor); backupNowPackages(userId, allPkgs, nonIncrementalBackup, monitor); } else { System.err.println("Provide '--all' flag or list of packages."); } } private void doCancel() { private void doCancel(@UserIdInt int userId) { String arg = nextArg(); if ("backups".equals(arg)) { try { Loading @@ -467,7 +488,7 @@ public final class Bmgr { System.err.println("Unknown command."); } private void doTransport() { private void doTransport(@UserIdInt int userId) { try { String which = nextArg(); if (which == null) { Loading Loading @@ -531,7 +552,7 @@ public final class Bmgr { } } private void doWipe() { private void doWipe(@UserIdInt int userId) { String transport = nextArg(); if (transport == null) { showUsage(); Loading Loading @@ -563,7 +584,7 @@ public final class Bmgr { } } private void doInit() { private void doInit(@UserIdInt int userId) { ArraySet<String> transports = new ArraySet<>(); String transport; while ((transport = nextArg()) != null) { Loading @@ -586,7 +607,7 @@ public final class Bmgr { } } private void doList() { private void doList(@UserIdInt int userId) { String arg = nextArg(); // sets, transports, packages set# if ("transports".equals(arg)) { doListTransports(); Loading @@ -603,8 +624,6 @@ public final class Bmgr { if ("sets".equals(arg)) { doListRestoreSets(); } else if ("transports".equals(arg)) { doListTransports(); } mRestore.endRestoreSession(); Loading Loading @@ -717,7 +736,7 @@ public final class Bmgr { } } private void doRestore() { private void doRestore(@UserIdInt int userId) { String arg = nextArg(); if (arg == null) { showUsage(); Loading Loading @@ -830,8 +849,18 @@ public final class Bmgr { return arg; } private int parseUserId() { String arg = nextArg(); if ("--user".equals(arg)) { return UserHandle.parseUserArg(nextArg()); } else { mNextArg--; return UserHandle.USER_SYSTEM; } } private static void showUsage() { System.err.println("usage: bmgr [backup|restore|list|transport|run]"); System.err.println("usage: bmgr [--user <userId>] [backup|restore|list|transport|run]"); System.err.println(" bmgr backup PACKAGE"); System.err.println(" bmgr enable BOOL"); System.err.println(" bmgr enabled"); Loading @@ -847,6 +876,10 @@ public final class Bmgr { System.err.println(" bmgr cancel backups"); System.err.println(" bmgr init TRANSPORT..."); System.err.println(""); System.err.println("The '--user' option specifies the user on which the operation is run."); System.err.println("It must be the first argument before the operation."); System.err.println("The default value is 0 which is the system user."); 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"); System.err.println("does not actually have changed data to store."); Loading
services/robotests/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ LOCAL_MODULE_TAGS := optional LOCAL_PRIVILEGED_MODULE := true LOCAL_STATIC_JAVA_LIBRARIES := \ bmgrlib \ services.backup \ services.core \ services.net Loading
services/robotests/src/com/android/commands/bmgr/BmgrTest.java 0 → 100644 +63 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.commands.bmgr; import static org.mockito.Mockito.verify; import android.app.backup.IBackupManager; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link com.android.commands.bmgr.Bmgr}. */ @RunWith(RobolectricTestRunner.class) @Presubmit public class BmgrTest { @Mock private IBackupManager mBackupManager; private Bmgr mBmgr; /** Common setup run before each test method. */ @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mBmgr = new Bmgr(mBackupManager); } /** * Test that bmgr uses the default user {@link UserHandle.USER_SYSTEM} if no user is specified. */ @Test public void testRun_whenUserNotSpecified_callsBackupManagerAsSystemUser() throws Exception { mBmgr.run(new String[] {"run"}); verify(mBackupManager).isBackupServiceActive(UserHandle.USER_SYSTEM); } /** Test that bmgr uses the specified user if an user is specified. */ @Test public void testRun_whenUserSpecified_callsBackupManagerAsSpecifiedUser() throws Exception { mBmgr.run(new String[] {"--user", "10"}); verify(mBackupManager).isBackupServiceActive(10); } }