From b0a213ef066a04181510c65cb8b71eacbd7712cf Mon Sep 17 00:00:00 2001 From: Ruslan Tkhakokhov Date: Tue, 14 Jul 2020 16:50:01 +0100 Subject: [PATCH 1/3] Refactor AppBackupUtils into BackupEligibilityRules AppBackupUtils contains static utility methods for checking backup eligibility of packages. Refactor it into an instance class called BackupEligibilityRules to better reflect the responsibilities of the class, encapsulate eligibility-related state as well as logic and simplify testing. See the bug description for full rationale. Bug: 161241479 Test: atest AppBackupUtilsTest Change-Id: I8ae47ac2a15e3c70da8feab752dd8354951224ea --- ...Utils.java => BackupEligibilityRules.java} | 97 +++++------ ...t.java => BackupEligibilityRulesTest.java} | 162 +++++++++--------- 2 files changed, 127 insertions(+), 132 deletions(-) rename services/backup/java/com/android/server/backup/utils/{AppBackupUtils.java => BackupEligibilityRules.java} (80%) rename services/tests/servicestests/src/com/android/server/backup/utils/{AppBackupUtilsTest.java => BackupEligibilityRulesTest.java} (82%) diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java similarity index 80% rename from services/backup/java/com/android/server/backup/utils/AppBackupUtils.java rename to services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java index a616e0e9a1c6d..162921528e95c 100644 --- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java +++ b/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java @@ -47,12 +47,34 @@ import java.util.Set; /** * Utility methods wrapping operations on ApplicationInfo and PackageInfo. */ -public class AppBackupUtils { +public class BackupEligibilityRules { private static final boolean DEBUG = false; // Whitelist of system packages that are eligible for backup in non-system users. private static final Set systemPackagesWhitelistedForAllUsers = Sets.newArraySet(PACKAGE_MANAGER_SENTINEL, PLATFORM_PACKAGE_NAME); + private final PackageManager mPackageManager; + private final PackageManagerInternal mPackageManagerInternal; + private final int mUserId; + @OperationType private final int mOperationType; + + public static BackupEligibilityRules forBackup(PackageManager packageManager, + PackageManagerInternal packageManagerInternal, + int userId) { + return new BackupEligibilityRules(packageManager, packageManagerInternal, userId, + OperationType.BACKUP); + } + + public BackupEligibilityRules(PackageManager packageManager, + PackageManagerInternal packageManagerInternal, + int userId, + @OperationType int operationType) { + mPackageManager = packageManager; + mPackageManagerInternal = packageManagerInternal; + mUserId = userId; + mOperationType = operationType; + } + /** * Returns whether app is eligible for backup. * @@ -65,32 +87,18 @@ public class AppBackupUtils { *
  • it is the special shared-storage backup package used for 'adb backup' * */ - public static boolean appIsEligibleForBackup(ApplicationInfo app, int userId) { - return appIsEligibleForBackup( - app, LocalServices.getService(PackageManagerInternal.class), userId, - OperationType.BACKUP); - } - - public static boolean appIsEligibleForBackup(ApplicationInfo app, int userId, - @OperationType int operationType) { - return appIsEligibleForBackup( - app, LocalServices.getService(PackageManagerInternal.class), userId, operationType); - } - @VisibleForTesting - static boolean appIsEligibleForBackup( - ApplicationInfo app, PackageManagerInternal packageManager, int userId, - @OperationType int operationType) { + public boolean appIsEligibleForBackup(ApplicationInfo app) { // 1. their manifest states android:allowBackup="false" boolean appAllowsBackup = (app.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0; - if (!appAllowsBackup && !forceFullBackup(app.uid, operationType)) { + if (!appAllowsBackup && !forceFullBackup(app.uid, mOperationType)) { return false; } // 2. they run as a system-level uid if (UserHandle.isCore(app.uid)) { // and the backup is happening for non-system user on a non-whitelisted package. - if (userId != UserHandle.USER_SYSTEM + if (mUserId != UserHandle.USER_SYSTEM && !systemPackagesWhitelistedForAllUsers.contains(app.packageName)) { return false; } @@ -111,7 +119,7 @@ public class AppBackupUtils { return false; } - return !appIsDisabled(app, packageManager, userId); + return !appIsDisabled(app); } /** @@ -124,18 +132,16 @@ public class AppBackupUtils { * {@link BackupTransport#isAppEligibleForBackup(PackageInfo, boolean)} * */ - public static boolean appIsRunningAndEligibleForBackupWithTransport( + public boolean appIsRunningAndEligibleForBackupWithTransport( @Nullable TransportClient transportClient, - String packageName, - PackageManager pm, - int userId) { + String packageName) { try { - PackageInfo packageInfo = pm.getPackageInfoAsUser(packageName, - PackageManager.GET_SIGNING_CERTIFICATES, userId); + PackageInfo packageInfo = mPackageManager.getPackageInfoAsUser(packageName, + PackageManager.GET_SIGNING_CERTIFICATES, mUserId); ApplicationInfo applicationInfo = packageInfo.applicationInfo; - if (!appIsEligibleForBackup(applicationInfo, userId) + if (!appIsEligibleForBackup(applicationInfo) || appIsStopped(applicationInfo) - || appIsDisabled(applicationInfo, userId)) { + || appIsDisabled(applicationInfo)) { return false; } if (transportClient != null) { @@ -144,7 +150,7 @@ public class AppBackupUtils { transportClient.connectOrThrow( "AppBackupUtils.appIsRunningAndEligibleForBackupWithTransport"); return transport.isAppEligibleForBackup( - packageInfo, AppBackupUtils.appGetsFullBackup(packageInfo)); + packageInfo, appGetsFullBackup(packageInfo)); } catch (Exception e) { Slog.e(TAG, "Unable to ask about eligibility: " + e.getMessage()); } @@ -157,14 +163,11 @@ public class AppBackupUtils { } /** Avoid backups of 'disabled' apps. */ - static boolean appIsDisabled(ApplicationInfo app, int userId) { - return appIsDisabled(app, LocalServices.getService(PackageManagerInternal.class), userId); - } - @VisibleForTesting - static boolean appIsDisabled( - ApplicationInfo app, PackageManagerInternal packageManager, int userId) { - int enabledSetting = packageManager.getApplicationEnabledState(app.packageName, userId); + boolean appIsDisabled( + ApplicationInfo app) { + int enabledSetting = mPackageManagerInternal.getApplicationEnabledState(app.packageName, + mUserId); switch (enabledSetting) { case PackageManager.COMPONENT_ENABLED_STATE_DISABLED: @@ -190,7 +193,7 @@ public class AppBackupUtils { *
  • The app has just been installed. * */ - public static boolean appIsStopped(ApplicationInfo app) { + public boolean appIsStopped(ApplicationInfo app) { return ((app.flags & ApplicationInfo.FLAG_STOPPED) != 0); } @@ -198,13 +201,9 @@ public class AppBackupUtils { * Returns whether the app can get full backup. Does *not* check overall backup eligibility * policy! */ - public static boolean appGetsFullBackup(PackageInfo pkg) { - return appGetsFullBackup(pkg, OperationType.BACKUP); - } - @VisibleForTesting - public static boolean appGetsFullBackup(PackageInfo pkg, @OperationType int operationType) { - if (forceFullBackup(pkg.applicationInfo.uid, operationType)) { + public boolean appGetsFullBackup(PackageInfo pkg) { + if (forceFullBackup(pkg.applicationInfo.uid, mOperationType)) { // If this is a migration, all non-system packages get full backup. return true; } @@ -218,12 +217,11 @@ public class AppBackupUtils { return true; } - public static boolean appIgnoresIncludeExcludeRules(ApplicationInfo app, - @OperationType int operationType) { - return forceFullBackup(app.uid, operationType); + public boolean appIgnoresIncludeExcludeRules(ApplicationInfo app) { + return forceFullBackup(app.uid, mOperationType); } - private static boolean forceFullBackup(int appUid, @OperationType int operationType) { + private boolean forceFullBackup(int appUid, @OperationType int operationType) { return operationType == OperationType.MIGRATION && !UserHandle.isCore(appUid); } @@ -232,7 +230,7 @@ public class AppBackupUtils { * Returns whether the app is only capable of doing key/value. We say it's not if it allows full * backup, and it is otherwise. */ - public static boolean appIsKeyValueOnly(PackageInfo pkg) { + public boolean appIsKeyValueOnly(PackageInfo pkg) { return !appGetsFullBackup(pkg); } @@ -254,8 +252,7 @@ public class AppBackupUtils { * * Note that if {@param target} is null we return false. */ - public static boolean signaturesMatch(Signature[] storedSigs, PackageInfo target, - PackageManagerInternal pmi) { + public boolean signaturesMatch(Signature[] storedSigs, PackageInfo target) { if (target == null || target.packageName == null) { return false; } @@ -296,7 +293,7 @@ public class AppBackupUtils { // TODO(b/73988180): address the case that app has declared restoreAnyVersion and is // restoring from higher version to lower after having rotated the key (i.e. higher // version has different sig than lower version that we want to restore to) - return pmi.isDataRestoreSafe(storedSigs[0], target.packageName); + return mPackageManagerInternal.isDataRestoreSafe(storedSigs[0], target.packageName); } else { // the app couldn't have rotated keys, since it was signed with multiple sigs - do // a check to see if we find a match for all stored sigs diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/BackupEligibilityRulesTest.java similarity index 82% rename from services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java rename to services/tests/servicestests/src/com/android/server/backup/utils/BackupEligibilityRulesTest.java index 201211ef60bf6..444155d12b3fa 100644 --- a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/utils/BackupEligibilityRulesTest.java @@ -22,7 +22,6 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import android.app.backup.BackupManager; import android.app.backup.BackupManager.OperationType; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; @@ -43,11 +42,13 @@ import com.android.server.backup.UserBackupManagerService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; @SmallTest @Presubmit @RunWith(AndroidJUnit4.class) -public class AppBackupUtilsTest { +public class BackupEligibilityRulesTest { private static final String CUSTOM_BACKUP_AGENT_NAME = "custom.backup.agent"; private static final String TEST_PACKAGE_NAME = "test_package"; @@ -56,15 +57,18 @@ public class AppBackupUtilsTest { private static final Signature SIGNATURE_3 = generateSignature((byte) 3); private static final Signature SIGNATURE_4 = generateSignature((byte) 4); - private PackageManagerInternal mMockPackageManagerInternal; + @Mock private PackageManagerInternal mMockPackageManagerInternal; + @Mock private PackageManager mPackageManager; + private BackupEligibilityRules mBackupEligibilityRules; private int mUserId; @Before public void setUp() throws Exception { - mMockPackageManagerInternal = mock(PackageManagerInternal.class); + MockitoAnnotations.initMocks(this); mUserId = UserHandle.USER_SYSTEM; + mBackupEligibilityRules = getBackupEligibilityRules(OperationType.BACKUP); } @Test @@ -75,8 +79,7 @@ public class AppBackupUtilsTest { applicationInfo.backupAgentName = CUSTOM_BACKUP_AGENT_NAME; applicationInfo.packageName = TEST_PACKAGE_NAME; - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -90,8 +93,7 @@ public class AppBackupUtilsTest { applicationInfo.backupAgentName = null; applicationInfo.packageName = TEST_PACKAGE_NAME; - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -104,8 +106,7 @@ public class AppBackupUtilsTest { applicationInfo.backupAgentName = CUSTOM_BACKUP_AGENT_NAME; applicationInfo.packageName = UserBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE; - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -121,8 +122,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isTrue(); } @@ -138,8 +138,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isTrue(); } @@ -155,8 +154,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isTrue(); } @@ -172,8 +170,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -189,8 +186,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -206,8 +202,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -218,8 +213,9 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = getApplicationInfo(Process.FIRST_APPLICATION_UID, /* flags */ 0, CUSTOM_BACKUP_AGENT_NAME); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.MIGRATION); + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( + OperationType.MIGRATION); + boolean isEligible = eligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isTrue(); } @@ -230,8 +226,9 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = getApplicationInfo(Process.SYSTEM_UID, /* flags */ 0, CUSTOM_BACKUP_AGENT_NAME); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.MIGRATION); + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( + OperationType.MIGRATION); + boolean isEligible = eligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -248,7 +245,7 @@ public class AppBackupUtilsTest { .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isFalse(); } @@ -266,7 +263,7 @@ public class AppBackupUtilsTest { boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isTrue(); } @@ -283,7 +280,7 @@ public class AppBackupUtilsTest { boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isFalse(); } @@ -300,7 +297,7 @@ public class AppBackupUtilsTest { boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isTrue(); } @@ -316,7 +313,7 @@ public class AppBackupUtilsTest { .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER); boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isTrue(); } @@ -332,7 +329,7 @@ public class AppBackupUtilsTest { .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED); boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isTrue(); } @@ -342,7 +339,7 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED; - boolean isStopped = AppBackupUtils.appIsStopped(applicationInfo); + boolean isStopped = mBackupEligibilityRules.appIsStopped(applicationInfo); assertThat(isStopped).isTrue(); } @@ -352,7 +349,7 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags = ~ApplicationInfo.FLAG_STOPPED; - boolean isStopped = AppBackupUtils.appIsStopped(applicationInfo); + boolean isStopped = mBackupEligibilityRules.appIsStopped(applicationInfo); assertThat(isStopped).isFalse(); } @@ -363,7 +360,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = null; - boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.BACKUP); + boolean result = mBackupEligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @@ -376,7 +373,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY; - boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.BACKUP); + boolean result = mBackupEligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @@ -389,7 +386,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY; - boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.BACKUP); + boolean result = mBackupEligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isFalse(); } @@ -401,7 +398,9 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo = getApplicationInfo(Process.FIRST_APPLICATION_UID, ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY, CUSTOM_BACKUP_AGENT_NAME); - boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.MIGRATION); + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( + OperationType.MIGRATION); + boolean result = eligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @@ -413,7 +412,9 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo = getApplicationInfo(Process.SYSTEM_UID, ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY, CUSTOM_BACKUP_AGENT_NAME); - boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.MIGRATION); + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( + OperationType.MIGRATION); + boolean result = eligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isFalse(); } @@ -424,7 +425,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = null; - boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); + boolean result = mBackupEligibilityRules.appIsKeyValueOnly(packageInfo); assertThat(result).isFalse(); } @@ -437,7 +438,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY; - boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); + boolean result = mBackupEligibilityRules.appIsKeyValueOnly(packageInfo); assertThat(result).isFalse(); } @@ -450,7 +451,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY; - boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); + boolean result = mBackupEligibilityRules.appIsKeyValueOnly(packageInfo); assertThat(result).isTrue(); } @@ -460,8 +461,9 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.SYSTEM_UID; - boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo, + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); + boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @@ -471,8 +473,9 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.SYSTEM_UID; - boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo, - OperationType.BACKUP); + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( + OperationType.MIGRATION); + boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @@ -482,8 +485,9 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.FIRST_APPLICATION_UID; - boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo, + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); + boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isTrue(); } @@ -493,16 +497,14 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.FIRST_APPLICATION_UID; - boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo, - OperationType.BACKUP); + boolean result = mBackupEligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_targetIsNull_returnsFalse() throws Exception { - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, null, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1}, null); assertThat(result).isFalse(); } @@ -514,8 +516,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; - boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isTrue(); } @@ -533,8 +534,7 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(null, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(null, packageInfo); assertThat(result).isFalse(); } @@ -552,8 +552,7 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isFalse(); } @@ -568,8 +567,8 @@ public class AppBackupUtilsTest { packageInfo.signingInfo = null; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1}, + packageInfo); assertThat(result).isFalse(); } @@ -583,8 +582,8 @@ public class AppBackupUtilsTest { packageInfo.signingInfo = null; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1}, + packageInfo); assertThat(result).isFalse(); } @@ -596,8 +595,7 @@ public class AppBackupUtilsTest { packageInfo.signingInfo = null; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(null, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(null, packageInfo); assertThat(result).isFalse(); } @@ -610,8 +608,7 @@ public class AppBackupUtilsTest { packageInfo.signingInfo = null; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isFalse(); } @@ -632,9 +629,8 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch( - new Signature[] {signature3Copy, signature1Copy, signature2Copy}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch( + new Signature[] {signature3Copy, signature1Copy, signature2Copy}, packageInfo); assertThat(result).isTrue(); } @@ -654,9 +650,8 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch( - new Signature[]{signature2Copy, signature1Copy}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch( + new Signature[]{signature2Copy, signature1Copy}, packageInfo); assertThat(result).isTrue(); } @@ -676,9 +671,8 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch( - new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch( + new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}, packageInfo); assertThat(result).isFalse(); } @@ -698,9 +692,8 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch( - new Signature[]{signature1Copy, signature2Copy, SIGNATURE_4}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch( + new Signature[]{signature1Copy, signature2Copy, SIGNATURE_4}, packageInfo); assertThat(result).isFalse(); } @@ -723,8 +716,8 @@ public class AppBackupUtilsTest { doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy, packageInfo.packageName); - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy}, - packageInfo, mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {signature1Copy}, + packageInfo); assertThat(result).isTrue(); } @@ -749,8 +742,8 @@ public class AppBackupUtilsTest { doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy, packageInfo.packageName); - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy}, - packageInfo, mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {signature1Copy}, + packageInfo); assertThat(result).isTrue(); } @@ -776,12 +769,17 @@ public class AppBackupUtilsTest { doReturn(false).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy, packageInfo.packageName); - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy}, - packageInfo, mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {signature1Copy}, + packageInfo); assertThat(result).isFalse(); } + private BackupEligibilityRules getBackupEligibilityRules(@OperationType int operationType) { + return new BackupEligibilityRules(mPackageManager, mMockPackageManagerInternal, mUserId, + operationType); + } + private static Signature generateSignature(byte i) { byte[] signatureBytes = new byte[256]; signatureBytes[0] = i; From 9a724ed0b3a4b6aa719e8e67a83dcd142abcbd47 Mon Sep 17 00:00:00 2001 From: Ruslan Tkhakokhov Date: Tue, 14 Jul 2020 17:40:54 +0100 Subject: [PATCH 2/3] Migrate usages of AppBackupUtils to BackupEligibilityRules After refactoring AppBackupUtils into BackupEligibilityRules (see the other linked CL), update the usages throughout the code. Bug: 161241479 Test: atest UserBackupManagerServiceTest atest TarBackupReaderTest atest BackupHandlerTest atest PerformUnifiedRestoreTaskTest Change-Id: I2a90c4f5b951fa3e3c564a1065ad10a88cc16273 --- .../backup/PackageManagerBackupAgent.java | 16 ++-- .../backup/UserBackupManagerService.java | 95 +++++++++++-------- .../fullbackup/PerformAdbBackupTask.java | 16 ++-- .../PerformFullTransportBackupTask.java | 18 ++-- .../server/backup/internal/BackupHandler.java | 16 +++- .../backup/keyvalue/KeyValueBackupTask.java | 30 +++--- .../server/backup/params/AdbBackupParams.java | 7 +- .../server/backup/params/BackupParams.java | 8 +- .../restore/PerformUnifiedRestoreTask.java | 10 +- .../server/backup/utils/RestoreUtils.java | 4 +- .../server/backup/utils/TarBackupReader.java | 5 +- .../shadows/ShadowBackupEligibilityRules.java | 78 +++++++++++++++ .../backup/UserBackupManagerServiceTest.java | 52 ++++------ 13 files changed, 233 insertions(+), 122 deletions(-) create mode 100644 services/robotests/src/com/android/server/testing/shadows/ShadowBackupEligibilityRules.java diff --git a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java index 2241569afe180..e80a6d9e09073 100644 --- a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java +++ b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java @@ -33,7 +33,7 @@ import android.os.ParcelFileDescriptor; import android.util.Slog; import com.android.server.LocalServices; -import com.android.server.backup.utils.AppBackupUtils; +import com.android.server.backup.utils.BackupEligibilityRules; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -134,10 +134,11 @@ public class PackageManagerBackupAgent extends BackupAgent { init(packageMgr, packages, userId); } - public PackageManagerBackupAgent(PackageManager packageMgr, int userId) { + public PackageManagerBackupAgent(PackageManager packageMgr, int userId, + BackupEligibilityRules backupEligibilityRules) { init(packageMgr, null, userId); - evaluateStorablePackages(); + evaluateStorablePackages(backupEligibilityRules); } private void init(PackageManager packageMgr, List packages, int userId) { @@ -153,18 +154,19 @@ public class PackageManagerBackupAgent extends BackupAgent { // We will need to refresh our understanding of what is eligible for // backup periodically; this entry point serves that purpose. - public void evaluateStorablePackages() { - mAllPackages = getStorableApplications(mPackageManager, mUserId); + public void evaluateStorablePackages(BackupEligibilityRules backupEligibilityRules) { + mAllPackages = getStorableApplications(mPackageManager, mUserId, backupEligibilityRules); } /** Gets all packages installed on user {@code userId} eligible for backup. */ - public static List getStorableApplications(PackageManager pm, int userId) { + public static List getStorableApplications(PackageManager pm, int userId, + BackupEligibilityRules backupEligibilityRules) { List pkgs = pm.getInstalledPackagesAsUser(PackageManager.GET_SIGNING_CERTIFICATES, userId); int N = pkgs.size(); for (int a = N-1; a >= 0; a--) { PackageInfo pkg = pkgs.get(a); - if (!AppBackupUtils.appIsEligibleForBackup(pkg.applicationInfo, userId)) { + if (!backupEligibilityRules.appIsEligibleForBackup(pkg.applicationInfo)) { pkgs.remove(a); } } diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index d6a075f18141d..ff21a733223c0 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -68,6 +68,7 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.PackageManagerInternal; import android.database.ContentObserver; import android.net.Uri; import android.os.Binder; @@ -127,7 +128,7 @@ import com.android.server.backup.restore.ActiveRestoreSession; import com.android.server.backup.restore.PerformUnifiedRestoreTask; import com.android.server.backup.transport.TransportClient; import com.android.server.backup.transport.TransportNotRegisteredException; -import com.android.server.backup.utils.AppBackupUtils; +import com.android.server.backup.utils.BackupEligibilityRules; import com.android.server.backup.utils.BackupManagerMonitorUtils; import com.android.server.backup.utils.BackupObserverUtils; import com.android.server.backup.utils.SparseArrayUtils; @@ -336,6 +337,7 @@ public class UserBackupManagerService { private final BackupManagerConstants mConstants; private final BackupWakeLock mWakelock; private final BackupHandler mBackupHandler; + private final BackupEligibilityRules mScheduledBackupEligibility; private final IBackupManager mBackupManagerBinder; @@ -563,6 +565,7 @@ public class UserBackupManagerService { mActivityManager = null; mStorageManager = null; mBackupManagerBinder = null; + mScheduledBackupEligibility = null; } private UserBackupManagerService( @@ -579,6 +582,8 @@ public class UserBackupManagerService { mPackageManagerBinder = AppGlobals.getPackageManager(); mActivityManager = ActivityManager.getService(); mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); + mScheduledBackupEligibility = getEligibilityRules(mPackageManager, userId, + OperationType.BACKUP); mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); @@ -914,7 +919,13 @@ public class UserBackupManagerService { * non-lifecycle agent instance, so we manually set up the context topology for it. */ public BackupAgent makeMetadataAgent() { - PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent(mPackageManager, mUserId); + return makeMetadataAgentWithEligibilityRules(mScheduledBackupEligibility); + } + + public BackupAgent makeMetadataAgentWithEligibilityRules( + BackupEligibilityRules backupEligibilityRules) { + PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent(mPackageManager, mUserId, + backupEligibilityRules); pmAgent.attach(mContext); pmAgent.onCreate(UserHandle.of(mUserId)); return pmAgent; @@ -996,7 +1007,8 @@ public class UserBackupManagerService { boolean changed = false; ArrayList schedule = null; List apps = - PackageManagerBackupAgent.getStorableApplications(mPackageManager, mUserId); + PackageManagerBackupAgent.getStorableApplications(mPackageManager, mUserId, + mScheduledBackupEligibility); if (mFullBackupScheduleFile.exists()) { try (FileInputStream fstream = new FileInputStream(mFullBackupScheduleFile); @@ -1026,9 +1038,9 @@ public class UserBackupManagerService { foundApps.add(pkgName); // all apps that we've addressed already try { PackageInfo pkg = mPackageManager.getPackageInfoAsUser(pkgName, 0, mUserId); - if (AppBackupUtils.appGetsFullBackup(pkg) - && AppBackupUtils.appIsEligibleForBackup(pkg.applicationInfo, - mUserId)) { + if (mScheduledBackupEligibility.appGetsFullBackup(pkg) + && mScheduledBackupEligibility.appIsEligibleForBackup( + pkg.applicationInfo)) { schedule.add(new FullBackupEntry(pkgName, lastBackup)); } else { if (DEBUG) { @@ -1047,9 +1059,9 @@ public class UserBackupManagerService { // New apps can arrive "out of band" via OTA and similar, so we also need to // scan to make sure that we're tracking all full-backup candidates properly for (PackageInfo app : apps) { - if (AppBackupUtils.appGetsFullBackup(app) - && AppBackupUtils.appIsEligibleForBackup(app.applicationInfo, - mUserId)) { + if (mScheduledBackupEligibility.appGetsFullBackup(app) + && mScheduledBackupEligibility.appIsEligibleForBackup( + app.applicationInfo)) { if (!foundApps.contains(app.packageName)) { if (MORE_DEBUG) { Slog.i( @@ -1080,8 +1092,9 @@ public class UserBackupManagerService { changed = true; schedule = new ArrayList<>(apps.size()); for (PackageInfo info : apps) { - if (AppBackupUtils.appGetsFullBackup(info) && AppBackupUtils.appIsEligibleForBackup( - info.applicationInfo, mUserId)) { + if (mScheduledBackupEligibility.appGetsFullBackup(info) + && mScheduledBackupEligibility.appIsEligibleForBackup( + info.applicationInfo)) { schedule.add(new FullBackupEntry(info.packageName, 0)); } } @@ -1381,9 +1394,9 @@ public class UserBackupManagerService { PackageInfo app = mPackageManager.getPackageInfoAsUser( packageName, /* flags */ 0, mUserId); - if (AppBackupUtils.appGetsFullBackup(app) - && AppBackupUtils.appIsEligibleForBackup( - app.applicationInfo, mUserId)) { + if (mScheduledBackupEligibility.appGetsFullBackup(app) + && mScheduledBackupEligibility.appIsEligibleForBackup( + app.applicationInfo)) { enqueueFullBackup(packageName, now); scheduleNextFullBackupJob(0); } else { @@ -1881,9 +1894,11 @@ public class UserBackupManagerService { OnTaskFinishedListener listener = caller -> mTransportManager.disposeOfTransportClient(transportClient, caller); + BackupEligibilityRules backupEligibilityRules = getEligibilityRulesForOperation( + operationType); Message msg = mBackupHandler.obtainMessage(MSG_REQUEST_BACKUP); - msg.obj = getRequestBackupParams(packages, observer, monitor, flags, operationType, + msg.obj = getRequestBackupParams(packages, observer, monitor, flags, backupEligibilityRules, transportClient, transportDirName, listener); mBackupHandler.sendMessage(msg); return BackupManager.SUCCESS; @@ -1891,7 +1906,7 @@ public class UserBackupManagerService { @VisibleForTesting BackupParams getRequestBackupParams(String[] packages, IBackupObserver observer, - IBackupManagerMonitor monitor, int flags, @OperationType int operationType, + IBackupManagerMonitor monitor, int flags, BackupEligibilityRules backupEligibilityRules, TransportClient transportClient, String transportDirName, OnTaskFinishedListener listener) { ArrayList fullBackupList = new ArrayList<>(); @@ -1904,13 +1919,12 @@ public class UserBackupManagerService { try { PackageInfo packageInfo = mPackageManager.getPackageInfoAsUser(packageName, PackageManager.GET_SIGNING_CERTIFICATES, mUserId); - if (!appIsEligibleForBackup(packageInfo.applicationInfo, mUserId, - operationType)) { + if (!backupEligibilityRules.appIsEligibleForBackup(packageInfo.applicationInfo)) { BackupObserverUtils.sendBackupOnPackageResult(observer, packageName, BackupManager.ERROR_BACKUP_NOT_ALLOWED); continue; } - if (appGetsFullBackup(packageInfo, operationType)) { + if (backupEligibilityRules.appGetsFullBackup(packageInfo)) { fullBackupList.add(packageInfo.packageName); } else { kvBackupList.add(packageInfo.packageName); @@ -1941,18 +1955,7 @@ public class UserBackupManagerService { return new BackupParams(transportClient, transportDirName, kvBackupList, fullBackupList, observer, monitor, listener, /* userInitiated */ true, nonIncrementalBackup, - operationType); - } - - @VisibleForTesting - boolean appIsEligibleForBackup(ApplicationInfo applicationInfo, int userId, - @OperationType int operationType) { - return AppBackupUtils.appIsEligibleForBackup(applicationInfo, userId, operationType); - } - - @VisibleForTesting - boolean appGetsFullBackup(PackageInfo packageInfo, @OperationType int operationType) { - return AppBackupUtils.appGetsFullBackup(packageInfo, operationType); + backupEligibilityRules); } /** Cancel all running backups. */ @@ -2481,7 +2484,7 @@ public class UserBackupManagerService { try { PackageInfo appInfo = mPackageManager.getPackageInfoAsUser( entry.packageName, 0, mUserId); - if (!AppBackupUtils.appGetsFullBackup(appInfo)) { + if (!mScheduledBackupEligibility.appGetsFullBackup(appInfo)) { // The head app isn't supposed to get full-data backups [any more]; // so we cull it and force a loop around to consider the new head // app. @@ -2562,7 +2565,8 @@ public class UserBackupManagerService { /* backupObserver */ null, /* monitor */ null, /* userInitiated */ false, - "BMS.beginFullBackup()"); + "BMS.beginFullBackup()", + getEligibilityRulesForOperation(OperationType.BACKUP)); // Acquiring wakelock for PerformFullTransportBackupTask before its start. mWakelock.acquire(); (new Thread(mRunningFullBackupTask)).start(); @@ -3001,7 +3005,7 @@ public class UserBackupManagerService { AdbBackupParams params = new AdbBackupParams(fd, includeApks, includeObbs, includeShared, doWidgets, doAllApps, includeSystem, compress, doKeyValue, - pkgList); + pkgList, mScheduledBackupEligibility); final int token = generateRandomIntegerToken(); synchronized (mAdbBackupRestoreConfirmations) { mAdbBackupRestoreConfirmations.put(token, params); @@ -3086,7 +3090,8 @@ public class UserBackupManagerService { /* backupObserver */ null, /* monitor */ null, /* userInitiated */ false, - "BMS.fullTransportBackup()"); + "BMS.fullTransportBackup()", + getEligibilityRulesForOperation(OperationType.BACKUP)); // Acquiring wakelock for PerformFullTransportBackupTask before its start. mWakelock.acquire(); (new Thread(task, "full-transport-master")).start(); @@ -4137,8 +4142,8 @@ public class UserBackupManagerService { TransportClient transportClient = mTransportManager.getCurrentTransportClient(callerLogString); boolean eligible = - AppBackupUtils.appIsRunningAndEligibleForBackupWithTransport( - transportClient, packageName, mPackageManager, mUserId); + mScheduledBackupEligibility.appIsRunningAndEligibleForBackupWithTransport( + transportClient, packageName); if (transportClient != null) { mTransportManager.disposeOfTransportClient(transportClient, callerLogString); } @@ -4160,9 +4165,8 @@ public class UserBackupManagerService { mTransportManager.getCurrentTransportClient(callerLogString); List eligibleApps = new LinkedList<>(); for (String packageName : packages) { - if (AppBackupUtils - .appIsRunningAndEligibleForBackupWithTransport( - transportClient, packageName, mPackageManager, mUserId)) { + if (mScheduledBackupEligibility.appIsRunningAndEligibleForBackupWithTransport( + transportClient, packageName)) { eligibleApps.add(packageName); } } @@ -4175,6 +4179,17 @@ public class UserBackupManagerService { } } + public BackupEligibilityRules getEligibilityRulesForOperation( + @OperationType int operationType) { + return getEligibilityRules(mPackageManager, mUserId, operationType); + } + + private static BackupEligibilityRules getEligibilityRules(PackageManager packageManager, + int userId, @OperationType int operationType) { + return new BackupEligibilityRules(packageManager, + LocalServices.getService(PackageManagerInternal.class), userId, operationType); + } + /** Prints service state for 'dumpsys backup'. */ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { long identityToken = Binder.clearCallingIdentity(); diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java index 0a7159bfe1b78..a69bd6b622644 100644 --- a/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java +++ b/services/backup/java/com/android/server/backup/fullbackup/PerformAdbBackupTask.java @@ -24,6 +24,8 @@ import static com.android.server.backup.UserBackupManagerService.BACKUP_FILE_HEA import static com.android.server.backup.UserBackupManagerService.BACKUP_FILE_VERSION; import static com.android.server.backup.UserBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE; +import android.app.backup.BackupManager; +import android.app.backup.BackupManager.OperationType; import android.app.backup.IFullBackupRestoreObserver; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; @@ -38,7 +40,7 @@ import com.android.server.AppWidgetBackupBridge; import com.android.server.backup.BackupRestoreTask; import com.android.server.backup.KeyValueAdbBackupEngine; import com.android.server.backup.UserBackupManagerService; -import com.android.server.backup.utils.AppBackupUtils; +import com.android.server.backup.utils.BackupEligibilityRules; import com.android.server.backup.utils.PasswordUtils; import java.io.ByteArrayOutputStream; @@ -83,12 +85,14 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor private final String mCurrentPassword; private final String mEncryptPassword; private final int mCurrentOpToken; + private final BackupEligibilityRules mBackupEligibilityRules; public PerformAdbBackupTask(UserBackupManagerService backupManagerService, ParcelFileDescriptor fd, IFullBackupRestoreObserver observer, boolean includeApks, boolean includeObbs, boolean includeShared, boolean doWidgets, String curPassword, String encryptPassword, boolean doAllApps, boolean doSystem, - boolean doCompress, boolean doKeyValue, String[] packages, AtomicBoolean latch) { + boolean doCompress, boolean doKeyValue, String[] packages, AtomicBoolean latch, + BackupEligibilityRules backupEligibilityRules) { super(observer); mUserBackupManagerService = backupManagerService; mCurrentOpToken = backupManagerService.generateRandomIntegerToken(); @@ -119,6 +123,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor } mCompress = doCompress; mKeyValue = doKeyValue; + mBackupEligibilityRules = backupEligibilityRules; } private void addPackagesToSet(TreeMap set, List pkgNames) { @@ -286,15 +291,14 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor Iterator> iter = packagesToBackup.entrySet().iterator(); while (iter.hasNext()) { PackageInfo pkg = iter.next().getValue(); - if (!AppBackupUtils.appIsEligibleForBackup(pkg.applicationInfo, - mUserBackupManagerService.getUserId()) - || AppBackupUtils.appIsStopped(pkg.applicationInfo)) { + if (!mBackupEligibilityRules.appIsEligibleForBackup(pkg.applicationInfo) + || mBackupEligibilityRules.appIsStopped(pkg.applicationInfo)) { iter.remove(); if (DEBUG) { Slog.i(TAG, "Package " + pkg.packageName + " is not eligible for backup, removing."); } - } else if (AppBackupUtils.appIsKeyValueOnly(pkg)) { + } else if (mBackupEligibilityRules.appIsKeyValueOnly(pkg)) { iter.remove(); if (DEBUG) { Slog.i(TAG, "Package " + pkg.packageName diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java index 738dd9bf0f0df..1fa88920ca74d 100644 --- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java +++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java @@ -53,7 +53,7 @@ import com.android.server.backup.internal.Operation; import com.android.server.backup.remote.RemoteCall; import com.android.server.backup.transport.TransportClient; import com.android.server.backup.transport.TransportNotAvailableException; -import com.android.server.backup.utils.AppBackupUtils; +import com.android.server.backup.utils.BackupEligibilityRules; import com.android.server.backup.utils.BackupManagerMonitorUtils; import com.android.server.backup.utils.BackupObserverUtils; @@ -107,7 +107,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba IBackupObserver backupObserver, IBackupManagerMonitor monitor, boolean userInitiated, - String caller) { + String caller, + BackupEligibilityRules backupEligibilityRules) { TransportManager transportManager = backupManagerService.getTransportManager(); TransportClient transportClient = transportManager.getCurrentTransportClient(caller); OnTaskFinishedListener listener = @@ -124,7 +125,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba backupObserver, monitor, listener, - userInitiated); + userInitiated, + backupEligibilityRules); } private static final String TAG = "PFTBT"; @@ -151,6 +153,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba private volatile boolean mCancelAll; private final int mCurrentOpToken; private final BackupAgentTimeoutParameters mAgentTimeoutParameters; + private final BackupEligibilityRules mBackupEligibilityRules; public PerformFullTransportBackupTask(UserBackupManagerService backupManagerService, TransportClient transportClient, @@ -158,7 +161,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba String[] whichPackages, boolean updateSchedule, FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver, @Nullable IBackupManagerMonitor monitor, @Nullable OnTaskFinishedListener listener, - boolean userInitiated) { + boolean userInitiated, BackupEligibilityRules backupEligibilityRules) { super(observer); this.mUserBackupManagerService = backupManagerService; mTransportClient = transportClient; @@ -176,6 +179,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba backupManagerService.getAgentTimeoutParameters(), "Timeout parameters cannot be null"); mUserId = backupManagerService.getUserId(); + mBackupEligibilityRules = backupEligibilityRules; if (backupManagerService.isBackupOperationInProgress()) { if (DEBUG) { @@ -193,7 +197,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba PackageInfo info = pm.getPackageInfoAsUser(pkg, PackageManager.GET_SIGNING_CERTIFICATES, mUserId); mCurrentPackage = info; - if (!AppBackupUtils.appIsEligibleForBackup(info.applicationInfo, mUserId)) { + if (!mBackupEligibilityRules.appIsEligibleForBackup(info.applicationInfo)) { // Cull any packages that have indicated that backups are not permitted, // that run as system-domain uids but do not define their own backup agents, // as well as any explicit mention of the 'special' shared-storage agent @@ -209,7 +213,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba BackupObserverUtils.sendBackupOnPackageResult(mBackupObserver, pkg, BackupManager.ERROR_BACKUP_NOT_ALLOWED); continue; - } else if (!AppBackupUtils.appGetsFullBackup(info)) { + } else if (!mBackupEligibilityRules.appGetsFullBackup(info)) { // Cull any packages that are found in the queue but now aren't supposed // to get full-data backup operations. if (MORE_DEBUG) { @@ -224,7 +228,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba BackupObserverUtils.sendBackupOnPackageResult(mBackupObserver, pkg, BackupManager.ERROR_BACKUP_NOT_ALLOWED); continue; - } else if (AppBackupUtils.appIsStopped(info.applicationInfo)) { + } else if (mBackupEligibilityRules.appIsStopped(info.applicationInfo)) { // Cull any packages in the 'stopped' state: they've either just been // installed or have explicitly been force-stopped by the user. In both // cases we do not want to launch them for backup. diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java index 87a8e49825293..1bb434950563d 100644 --- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java +++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java @@ -20,6 +20,8 @@ import static com.android.server.backup.BackupManagerService.DEBUG; import static com.android.server.backup.BackupManagerService.MORE_DEBUG; import static com.android.server.backup.BackupManagerService.TAG; +import android.app.backup.BackupManager; +import android.app.backup.BackupManager.OperationType; import android.app.backup.RestoreSet; import android.os.Handler; import android.os.HandlerThread; @@ -222,7 +224,9 @@ public class BackupHandler extends Handler { listener, Collections.emptyList(), /* userInitiated */ false, - /* nonIncremental */ false); + /* nonIncremental */ false, + backupManagerService.getEligibilityRulesForOperation( + OperationType.BACKUP)); } catch (Exception e) { // unable to ask the transport its dir name -- transient failure, since // the above check succeeded. Try again next time. @@ -279,7 +283,8 @@ public class BackupHandler extends Handler { params.observer, params.includeApks, params.includeObbs, params.includeShared, params.doWidgets, params.curPassword, params.encryptPassword, params.allApps, params.includeSystem, - params.doCompress, params.includeKeyValue, params.packages, params.latch); + params.doCompress, params.includeKeyValue, params.packages, params.latch, + params.backupEligibilityRules); (new Thread(task, "adb-backup")).start(); break; } @@ -299,7 +304,9 @@ public class BackupHandler extends Handler { params.pmToken, params.isSystemRestore, params.filterSet, - params.listener); + params.listener, + backupManagerService.getEligibilityRulesForOperation( + OperationType.BACKUP)); synchronized (backupManagerService.getPendingRestores()) { if (backupManagerService.isRestoreInProgress()) { @@ -462,7 +469,8 @@ public class BackupHandler extends Handler { params.listener, params.fullPackages, /* userInitiated */ true, - params.nonIncrementalBackup); + params.nonIncrementalBackup, + params.mBackupEligibilityRules); break; } diff --git a/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java b/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java index f146e491c4882..6124171c7a0e7 100644 --- a/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java +++ b/services/backup/java/com/android/server/backup/keyvalue/KeyValueBackupTask.java @@ -67,7 +67,7 @@ import com.android.server.backup.remote.RemoteCallable; import com.android.server.backup.remote.RemoteResult; import com.android.server.backup.transport.TransportClient; import com.android.server.backup.transport.TransportNotAvailableException; -import com.android.server.backup.utils.AppBackupUtils; +import com.android.server.backup.utils.BackupEligibilityRules; import libcore.io.IoUtils; @@ -220,7 +220,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable { OnTaskFinishedListener listener, List pendingFullBackups, boolean userInitiated, - boolean nonIncremental) { + boolean nonIncremental, + BackupEligibilityRules backupEligibilityRules) { KeyValueBackupReporter reporter = new KeyValueBackupReporter(backupManagerService, observer, monitor); KeyValueBackupTask task = @@ -234,7 +235,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable { listener, pendingFullBackups, userInitiated, - nonIncremental); + nonIncremental, + backupEligibilityRules); Thread thread = new Thread(task, "key-value-backup-" + THREAD_COUNT.incrementAndGet()); thread.start(); KeyValueBackupReporter.onNewThread(thread.getName()); @@ -258,6 +260,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable { private final List mPendingFullBackups; private final Object mQueueLock; @Nullable private final DataChangedJournal mJournal; + private final BackupEligibilityRules mBackupEligibilityRules; @Nullable private PerformFullTransportBackupTask mFullBackupTask; @Nullable private IBackupAgent mAgent; @@ -307,7 +310,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable { OnTaskFinishedListener taskFinishedListener, List pendingFullBackups, boolean userInitiated, - boolean nonIncremental) { + boolean nonIncremental, + BackupEligibilityRules backupEligibilityRules) { mBackupManagerService = backupManagerService; mPackageManager = backupManagerService.getPackageManager(); mTransportClient = transportClient; @@ -330,6 +334,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable { mQueueLock = mBackupManagerService.getQueueLock(); mBlankStateFile = new File(mStateDirectory, BLANK_STATE_FILE_NAME); mUserId = backupManagerService.getUserId(); + mBackupEligibilityRules = backupEligibilityRules; } private void registerTask() { @@ -456,9 +461,9 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable { /** Determine if a package is eligible to be backed up to the transport */ private boolean isEligibleForNoDataCall(PackageInfo packageInfo) { - return AppBackupUtils.appIsKeyValueOnly(packageInfo) - && AppBackupUtils.appIsRunningAndEligibleForBackupWithTransport(mTransportClient, - packageInfo.packageName, mPackageManager, mUserId); + return mBackupEligibilityRules.appIsKeyValueOnly(packageInfo) + && mBackupEligibilityRules.appIsRunningAndEligibleForBackupWithTransport( + mTransportClient, packageInfo.packageName); } /** Send the "no data changed" message to a transport for a specific package */ @@ -642,7 +647,8 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable { mReporter.getObserver(), mReporter.getMonitor(), mTaskFinishedListener, - mUserInitiated); + mUserInitiated, + mBackupEligibilityRules); } private void backupPm() throws TaskException { @@ -704,15 +710,15 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable { throw AgentException.permanent(e); } ApplicationInfo applicationInfo = packageInfo.applicationInfo; - if (!AppBackupUtils.appIsEligibleForBackup(applicationInfo, mUserId)) { + if (!mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo)) { mReporter.onPackageNotEligibleForBackup(packageName); throw AgentException.permanent(); } - if (AppBackupUtils.appGetsFullBackup(packageInfo)) { + if (mBackupEligibilityRules.appGetsFullBackup(packageInfo)) { mReporter.onPackageEligibleForFullBackup(packageName); throw AgentException.permanent(); } - if (AppBackupUtils.appIsStopped(applicationInfo)) { + if (mBackupEligibilityRules.appIsStopped(applicationInfo)) { mReporter.onPackageStopped(packageName); throw AgentException.permanent(); } @@ -843,7 +849,7 @@ public class KeyValueBackupTask implements BackupRestoreTask, Runnable { /** Same as {@link #extractAgentData(PackageInfo)}, but only for PM package. */ private void extractPmAgentData(PackageInfo packageInfo) throws AgentException, TaskException { Preconditions.checkArgument(packageInfo.packageName.equals(PM_PACKAGE)); - BackupAgent pmAgent = mBackupManagerService.makeMetadataAgent(); + BackupAgent pmAgent = mBackupManagerService.makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); mAgent = IBackupAgent.Stub.asInterface(pmAgent.onBind()); extractAgentData(packageInfo, mAgent); } diff --git a/services/backup/java/com/android/server/backup/params/AdbBackupParams.java b/services/backup/java/com/android/server/backup/params/AdbBackupParams.java index 5c1ba24ffbc28..f08c5fa3919b8 100644 --- a/services/backup/java/com/android/server/backup/params/AdbBackupParams.java +++ b/services/backup/java/com/android/server/backup/params/AdbBackupParams.java @@ -18,6 +18,8 @@ package com.android.server.backup.params; import android.os.ParcelFileDescriptor; +import com.android.server.backup.utils.BackupEligibilityRules; + public class AdbBackupParams extends AdbParams { public boolean includeApks; @@ -29,10 +31,12 @@ public class AdbBackupParams extends AdbParams { public boolean doCompress; public boolean includeKeyValue; public String[] packages; + public BackupEligibilityRules backupEligibilityRules; public AdbBackupParams(ParcelFileDescriptor output, boolean saveApks, boolean saveObbs, boolean saveShared, boolean alsoWidgets, boolean doAllApps, boolean doSystem, - boolean compress, boolean doKeyValue, String[] pkgList) { + boolean compress, boolean doKeyValue, String[] pkgList, + BackupEligibilityRules eligibilityRules) { fd = output; includeApks = saveApks; includeObbs = saveObbs; @@ -43,5 +47,6 @@ public class AdbBackupParams extends AdbParams { doCompress = compress; includeKeyValue = doKeyValue; packages = pkgList; + backupEligibilityRules = eligibilityRules; } } diff --git a/services/backup/java/com/android/server/backup/params/BackupParams.java b/services/backup/java/com/android/server/backup/params/BackupParams.java index 514434ec9d392..800257002f012 100644 --- a/services/backup/java/com/android/server/backup/params/BackupParams.java +++ b/services/backup/java/com/android/server/backup/params/BackupParams.java @@ -16,12 +16,12 @@ package com.android.server.backup.params; -import android.app.backup.BackupManager.OperationType; import android.app.backup.IBackupManagerMonitor; import android.app.backup.IBackupObserver; import com.android.server.backup.internal.OnTaskFinishedListener; import com.android.server.backup.transport.TransportClient; +import com.android.server.backup.utils.BackupEligibilityRules; import java.util.ArrayList; @@ -36,12 +36,12 @@ public class BackupParams { public OnTaskFinishedListener listener; public boolean userInitiated; public boolean nonIncrementalBackup; - @OperationType public int operationType; + public BackupEligibilityRules mBackupEligibilityRules; public BackupParams(TransportClient transportClient, String dirName, ArrayList kvPackages, ArrayList fullPackages, IBackupObserver observer, IBackupManagerMonitor monitor, OnTaskFinishedListener listener, boolean userInitiated, - boolean nonIncrementalBackup, int operationType) { + boolean nonIncrementalBackup, BackupEligibilityRules backupEligibilityRules) { this.transportClient = transportClient; this.dirName = dirName; this.kvPackages = kvPackages; @@ -51,6 +51,6 @@ public class BackupParams { this.listener = listener; this.userInitiated = userInitiated; this.nonIncrementalBackup = nonIncrementalBackup; - this.operationType = operationType; + this.mBackupEligibilityRules = backupEligibilityRules; } } diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java index 12113fea12a44..a7e360403cccf 100644 --- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java +++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java @@ -66,7 +66,7 @@ import com.android.server.backup.TransportManager; import com.android.server.backup.UserBackupManagerService; import com.android.server.backup.internal.OnTaskFinishedListener; import com.android.server.backup.transport.TransportClient; -import com.android.server.backup.utils.AppBackupUtils; +import com.android.server.backup.utils.BackupEligibilityRules; import com.android.server.backup.utils.BackupManagerMonitorUtils; import libcore.io.IoUtils; @@ -186,7 +186,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { int pmToken, boolean isFullSystemRestore, @Nullable String[] filterSet, - OnTaskFinishedListener listener) { + OnTaskFinishedListener listener, + BackupEligibilityRules backupEligibilityRules) { this.backupManagerService = backupManagerService; mUserId = backupManagerService.getUserId(); mTransportManager = backupManagerService.getTransportManager(); @@ -218,7 +219,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { // We want everything and a pony List apps = PackageManagerBackupAgent.getStorableApplications( - backupManagerService.getPackageManager(), mUserId); + backupManagerService.getPackageManager(), mUserId, + backupEligibilityRules); filterSet = packagesToNames(apps); if (DEBUG) { Slog.i(TAG, "Full restore; asking about " + filterSet.length + " apps"); @@ -245,7 +247,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { continue; } - if (AppBackupUtils.appIsEligibleForBackup(info.applicationInfo, mUserId)) { + if (backupEligibilityRules.appIsEligibleForBackup(info.applicationInfo)) { mAcceptSet.add(info); } } catch (NameNotFoundException e) { diff --git a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java index 97bde9c03440b..8e8bac435503b 100644 --- a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java +++ b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java @@ -159,7 +159,9 @@ public class RestoreUtils { Signature[] sigs = manifestSignatures.get(info.packageName); PackageManagerInternal pmi = LocalServices.getService( PackageManagerInternal.class); - if (AppBackupUtils.signaturesMatch(sigs, pkg, pmi)) { + BackupEligibilityRules eligibilityRules = + BackupEligibilityRules.forBackup(packageManager, pmi, userId); + if (eligibilityRules.signaturesMatch(sigs, pkg)) { // If this is a system-uid app without a declared backup agent, // don't restore any of the file data. if (UserHandle.isCore(pkg.applicationInfo.uid) diff --git a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java index d2d382dfc14d2..bf8e9c8512ae3 100644 --- a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java +++ b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java @@ -394,7 +394,8 @@ public class TarBackupReader { } RestorePolicy policy = RestorePolicy.IGNORE; - + BackupEligibilityRules eligibilityRules = BackupEligibilityRules.forBackup(packageManager, + pmi, userId); // Okay, got the manifest info we need... try { PackageInfo pkgInfo = packageManager.getPackageInfoAsUser( @@ -413,7 +414,7 @@ public class TarBackupReader { // such packages are signed with the platform cert instead of // the app developer's cert, so they're different on every // device. - if (AppBackupUtils.signaturesMatch(signatures, pkgInfo, pmi)) { + if (eligibilityRules.signaturesMatch(signatures, pkgInfo)) { if ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_RESTORE_ANY_VERSION) != 0) { Slog.i(TAG, "Package has restoreAnyVersion; taking data"); diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowBackupEligibilityRules.java b/services/robotests/src/com/android/server/testing/shadows/ShadowBackupEligibilityRules.java new file mode 100644 index 0000000000000..566b0e1514023 --- /dev/null +++ b/services/robotests/src/com/android/server/testing/shadows/ShadowBackupEligibilityRules.java @@ -0,0 +1,78 @@ +/* + * 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.server.testing.shadows; + +import android.annotation.Nullable; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; + +import com.android.server.backup.transport.TransportClient; +import com.android.server.backup.utils.BackupEligibilityRules; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.annotation.Resetter; + +import java.util.HashSet; +import java.util.Set; + +@Implements(BackupEligibilityRules.class) +public class ShadowBackupEligibilityRules { + private static final Set sAppsRunningAndEligibleForBackupWithTransport = + new HashSet<>(); + private static final Set sAppsEligibleForBackup = new HashSet<>(); + private static final Set sAppsGetFullBackup = new HashSet<>(); + + public static void setAppRunningAndEligibleForBackupWithTransport(String packageName) { + sAppsEligibleForBackup.add(packageName); + sAppsRunningAndEligibleForBackupWithTransport.add(packageName); + } + + public static void setAppEligibleForBackup(String packageName) { + sAppsEligibleForBackup.add(packageName); + } + + /** By default the app will be key-value. */ + public static void setAppGetsFullBackup(String packageName) { + sAppsGetFullBackup.add(packageName); + } + + @Implementation + protected boolean appIsRunningAndEligibleForBackupWithTransport( + @Nullable TransportClient transportClient, + String packageName) { + return sAppsRunningAndEligibleForBackupWithTransport.contains(packageName); + } + + @Implementation + protected boolean appIsEligibleForBackup(ApplicationInfo app) { + return sAppsEligibleForBackup.contains(app.packageName); + } + + @Implementation + protected boolean appGetsFullBackup(PackageInfo packageInfo) { + return sAppsGetFullBackup.contains(packageInfo.packageName); + } + + @Resetter + public static void reset() { + sAppsRunningAndEligibleForBackupWithTransport.clear(); + sAppsEligibleForBackup.clear(); + sAppsGetFullBackup.clear(); + } +} diff --git a/services/tests/servicestests/src/com/android/server/backup/UserBackupManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/backup/UserBackupManagerServiceTest.java index ccb2ea3e46dac..b98f0257d7b73 100644 --- a/services/tests/servicestests/src/com/android/server/backup/UserBackupManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/UserBackupManagerServiceTest.java @@ -18,6 +18,7 @@ package com.android.server.backup; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; @@ -36,6 +37,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.server.backup.internal.OnTaskFinishedListener; import com.android.server.backup.params.BackupParams; import com.android.server.backup.transport.TransportClient; +import com.android.server.backup.utils.BackupEligibilityRules; import org.junit.Before; import org.junit.Test; @@ -54,6 +56,7 @@ public class UserBackupManagerServiceTest { @Mock IBackupObserver mBackupObserver; @Mock PackageManager mPackageManager; @Mock TransportClient mTransportClient; + @Mock BackupEligibilityRules mBackupEligibilityRules; private TestBackupService mService; @@ -82,54 +85,51 @@ public class UserBackupManagerServiceTest { } @Test - public void getRequestBackupParams_isMigrationAndAppGetsFullBackup() throws Exception { + public void getRequestBackupParams_appIsEligibleForFullBackup() throws Exception { when(mPackageManager.getPackageInfoAsUser(anyString(), anyInt(), anyInt())).thenReturn( getPackageInfo(TEST_PACKAGE)); - mService.mAppIsEligibleForBackup = true; - mService.mAppGetsFullBackup = true; + when(mBackupEligibilityRules.appIsEligibleForBackup(any())).thenReturn(true); + when(mBackupEligibilityRules.appGetsFullBackup(any())).thenReturn(true); BackupParams params = mService.getRequestBackupParams(TEST_PACKAGES, mBackupObserver, - mBackupManagerMonitor, /* flags */ 0, OperationType.MIGRATION, + mBackupManagerMonitor, /* flags */ 0, mBackupEligibilityRules, mTransportClient, /* transportDirName */ "", OnTaskFinishedListener.NOP); assertThat(params.kvPackages).isEmpty(); assertThat(params.fullPackages).contains(TEST_PACKAGE); - assertThat(params.operationType).isEqualTo(OperationType.MIGRATION); - assertThat(mService.mOperationType).isEqualTo(OperationType.MIGRATION); + assertThat(params.mBackupEligibilityRules).isEqualTo(mBackupEligibilityRules); } @Test - public void getRequestBackupParams_isMigrationAndAppGetsKeyValueBackup() throws Exception { + public void getRequestBackupParams_appIsEligibleForKeyValueBackup() throws Exception { when(mPackageManager.getPackageInfoAsUser(anyString(), anyInt(), anyInt())).thenReturn( getPackageInfo(TEST_PACKAGE)); - mService.mAppIsEligibleForBackup = true; - mService.mAppGetsFullBackup = false; + when(mBackupEligibilityRules.appIsEligibleForBackup(any())).thenReturn(true); + when(mBackupEligibilityRules.appGetsFullBackup(any())).thenReturn(false); BackupParams params = mService.getRequestBackupParams(TEST_PACKAGES, mBackupObserver, - mBackupManagerMonitor, /* flags */ 0, OperationType.MIGRATION, + mBackupManagerMonitor, /* flags */ 0, mBackupEligibilityRules, mTransportClient, /* transportDirName */ "", OnTaskFinishedListener.NOP); assertThat(params.kvPackages).contains(TEST_PACKAGE); assertThat(params.fullPackages).isEmpty(); - assertThat(params.operationType).isEqualTo(OperationType.MIGRATION); - assertThat(mService.mOperationType).isEqualTo(OperationType.MIGRATION); + assertThat(params.mBackupEligibilityRules).isEqualTo(mBackupEligibilityRules); } @Test - public void getRequestBackupParams_isMigrationAndAppNotEligibleForBackup() throws Exception { + public void getRequestBackupParams_appIsNotEligibleForBackup() throws Exception { when(mPackageManager.getPackageInfoAsUser(anyString(), anyInt(), anyInt())).thenReturn( getPackageInfo(TEST_PACKAGE)); - mService.mAppIsEligibleForBackup = false; - mService.mAppGetsFullBackup = false; + when(mBackupEligibilityRules.appIsEligibleForBackup(any())).thenReturn(false); + when(mBackupEligibilityRules.appGetsFullBackup(any())).thenReturn(false); BackupParams params = mService.getRequestBackupParams(TEST_PACKAGES, mBackupObserver, - mBackupManagerMonitor, /* flags */ 0, OperationType.MIGRATION, + mBackupManagerMonitor, /* flags */ 0, mBackupEligibilityRules, mTransportClient, /* transportDirName */ "", OnTaskFinishedListener.NOP); assertThat(params.kvPackages).isEmpty(); assertThat(params.fullPackages).isEmpty(); - assertThat(params.operationType).isEqualTo(OperationType.MIGRATION); - assertThat(mService.mOperationType).isEqualTo(OperationType.MIGRATION); + assertThat(params.mBackupEligibilityRules).isEqualTo(mBackupEligibilityRules); } private static PackageInfo getPackageInfo(String packageName) { @@ -141,9 +141,6 @@ public class UserBackupManagerServiceTest { private static class TestBackupService extends UserBackupManagerService { boolean isEnabledStatePersisted = false; - boolean mAppIsEligibleForBackup = false; - boolean mAppGetsFullBackup = false; - int mOperationType = 0; TestBackupService(Context context, PackageManager packageManager) { super(context, packageManager); @@ -161,18 +158,5 @@ public class UserBackupManagerServiceTest { @Override void updateStateOnBackupEnabled(boolean wasEnabled, boolean enable) {} - - @Override - boolean appIsEligibleForBackup(ApplicationInfo applicationInfo, int userId, - @OperationType int operationType) { - mOperationType = operationType; - return mAppIsEligibleForBackup; - } - - @Override - boolean appGetsFullBackup(PackageInfo packageInfo, @OperationType int operationType) { - mOperationType = operationType; - return mAppGetsFullBackup; - } } } From 9a747776b28392724dfc588b06dfd1531bcfbd45 Mon Sep 17 00:00:00 2001 From: Ruslan Tkhakokhov Date: Wed, 15 Jul 2020 23:31:50 +0100 Subject: [PATCH 3/3] Update robolectric tetst for BackupEligibilityRules refactor Bug: 161241479 Test: atest RunBackupFrameworksServicesRoboTests Change-Id: I7705d441947b1e2143f5da3c298294f5a67377f0 --- .../backup/UserBackupManagerServiceTest.java | 16 ++-- .../keyvalue/KeyValueBackupTaskTest.java | 68 ++++++++++------ .../testing/shadows/ShadowAppBackupUtils.java | 81 ------------------- .../shadows/ShadowKeyValueBackupTask.java | 4 +- .../ShadowPerformUnifiedRestoreTask.java | 4 +- 5 files changed, 59 insertions(+), 114 deletions(-) delete mode 100644 services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java diff --git a/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java b/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java index dfe75ed50cd47..06d51a4be920e 100644 --- a/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java +++ b/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java @@ -61,7 +61,7 @@ import com.android.server.backup.testing.BackupManagerServiceTestUtils; import com.android.server.backup.testing.TransportData; import com.android.server.backup.testing.TransportTestUtils.TransportMock; import com.android.server.backup.transport.TransportNotRegisteredException; -import com.android.server.testing.shadows.ShadowAppBackupUtils; +import com.android.server.testing.shadows.ShadowBackupEligibilityRules; import com.android.server.testing.shadows.ShadowApplicationPackageManager; import com.android.server.testing.shadows.ShadowBinder; import com.android.server.testing.shadows.ShadowKeyValueBackupJob; @@ -99,7 +99,7 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) @Config( shadows = { - ShadowAppBackupUtils.class, + ShadowBackupEligibilityRules.class, ShadowApplicationPackageManager.class, ShadowSystemServiceRegistry.class }) @@ -159,7 +159,7 @@ public class UserBackupManagerServiceTest { @After public void tearDown() throws Exception { mBackupThread.quit(); - ShadowAppBackupUtils.reset(); + ShadowBackupEligibilityRules.reset(); ShadowApplicationPackageManager.reset(); } @@ -236,7 +236,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); TransportMock transportMock = setUpCurrentTransport(mTransportManager, backupTransport()); registerPackages(PACKAGE_1); - ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1); + ShadowBackupEligibilityRules.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1); UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); boolean result = backupManagerService.isAppEligibleForBackup(PACKAGE_1); @@ -255,7 +255,7 @@ public class UserBackupManagerServiceTest { mShadowContext.denyPermissions(android.Manifest.permission.BACKUP); setUpCurrentTransport(mTransportManager, mTransport); registerPackages(PACKAGE_1); - ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1); + ShadowBackupEligibilityRules.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1); UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); expectThrows( @@ -273,7 +273,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); TransportMock transportMock = setUpCurrentTransport(mTransportManager, mTransport); registerPackages(PACKAGE_1, PACKAGE_2); - ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1); + ShadowBackupEligibilityRules.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1); UserBackupManagerService backupManagerService = createUserBackupManagerServiceAndRunTasks(); String[] filtered = @@ -801,7 +801,7 @@ public class UserBackupManagerServiceTest { mShadowContext.grantPermissions(android.Manifest.permission.BACKUP); for (String packageName : packages) { registerPackages(packageName); - ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(packageName); + ShadowBackupEligibilityRules.setAppRunningAndEligibleForBackupWithTransport(packageName); } setUpCurrentTransport(mTransportManager, mTransport); } @@ -962,7 +962,7 @@ public class UserBackupManagerServiceTest { @Config(shadows = ShadowKeyValueBackupTask.class) public void testRequestBackup_whenPackageIsFullBackup() throws Exception { setUpForRequestBackup(PACKAGE_1); - ShadowAppBackupUtils.setAppGetsFullBackup(PACKAGE_1); + ShadowBackupEligibilityRules.setAppGetsFullBackup(PACKAGE_1); UserBackupManagerService backupManagerService = createBackupManagerServiceForRequestBackup(); diff --git a/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java b/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java index b5c9375fcc0d8..6184c4ed7f1a6 100644 --- a/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java +++ b/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java @@ -115,6 +115,7 @@ import com.android.server.backup.testing.TestUtils.ThrowingRunnable; import com.android.server.backup.testing.TransportData; import com.android.server.backup.testing.TransportTestUtils; import com.android.server.backup.testing.TransportTestUtils.TransportMock; +import com.android.server.backup.utils.BackupEligibilityRules; import com.android.server.testing.shadows.FrameworkShadowLooper; import com.android.server.testing.shadows.ShadowApplicationPackageManager; import com.android.server.testing.shadows.ShadowBackupDataInput; @@ -176,6 +177,7 @@ public class KeyValueBackupTaskTest { private static final String BACKUP_AGENT_SHARED_PREFS_SYNCHRONIZER_CLASS = "android.app.backup.BackupAgent$SharedPrefsSynchronizer"; private static final int USER_ID = 10; + private static final int OPERATION_TYPE = BackupManager.OperationType.BACKUP; @Mock private TransportManager mTransportManager; @Mock private DataChangedJournal mOldJournal; @@ -183,6 +185,7 @@ public class KeyValueBackupTaskTest { @Mock private IBackupManagerMonitor mMonitor; @Mock private OnTaskFinishedListener mListener; @Mock private PackageManagerInternal mPackageManagerInternal; + private UserBackupManagerService mBackupManagerService; private TransportData mTransport; private ShadowLooper mShadowBackupLooper; @@ -198,6 +201,7 @@ public class KeyValueBackupTaskTest { private Looper mMainLooper; private FrameworkShadowLooper mShadowMainLooper; private Context mContext; + private BackupEligibilityRules mBackupEligibilityRules; @Before public void setUp() throws Exception { @@ -253,6 +257,8 @@ public class KeyValueBackupTaskTest { .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); LocalServices.removeServiceForTest(PackageManagerInternal.class); LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal); + mBackupEligibilityRules = new BackupEligibilityRules(mPackageManager, + LocalServices.getService(PackageManagerInternal.class), USER_ID, OPERATION_TYPE); } @After @@ -479,7 +485,8 @@ public class KeyValueBackupTaskTest { TransportMock transportMock = setUpInitializedTransport(mTransport); setUpAgentWithData(PACKAGE_1); BackupAgent pmAgent = spy(createPmAgent()); - doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent(); + doReturn(forward(pmAgent)).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); KeyValueBackupTask task = createKeyValueBackupTask(transportMock, true, PACKAGE_1); runTask(task); @@ -492,7 +499,8 @@ public class KeyValueBackupTaskTest { TransportMock transportMock = setUpInitializedTransport(mTransport); setUpAgentWithData(PACKAGE_1); BackupAgent pmAgent = spy(createPmAgent()); - doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent(); + doReturn(forward(pmAgent)).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); KeyValueBackupTask task = createKeyValueBackupTask(transportMock, true, PACKAGE_1, PM_PACKAGE); @@ -506,7 +514,8 @@ public class KeyValueBackupTaskTest { TransportMock transportMock = setUpInitializedTransport(mTransport); setUpAgentWithData(PACKAGE_1); BackupAgent pmAgent = spy(createPmAgent()); - doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent(); + doReturn(forward(pmAgent)).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); KeyValueBackupTask task = createKeyValueBackupTask(transportMock, false, PACKAGE_1); runTask(task); @@ -742,7 +751,7 @@ public class KeyValueBackupTaskTest { verify(mBackupManagerService).setWorkSource(null); verify(mObserver).onResult(PACKAGE_1.packageName, ERROR_AGENT_FAILURE); - verify(mObserver).backupFinished(BackupManager.SUCCESS); + verify(mObserver).backupFinished(SUCCESS); assertBackupPendingFor(PACKAGE_1); } @@ -775,7 +784,7 @@ public class KeyValueBackupTaskTest { verify(mBackupManagerService).setWorkSource(null); verify(mObserver).onResult(PACKAGE_1.packageName, ERROR_AGENT_FAILURE); - verify(mObserver).backupFinished(BackupManager.SUCCESS); + verify(mObserver).backupFinished(SUCCESS); assertBackupPendingFor(PACKAGE_1); } @@ -792,7 +801,7 @@ public class KeyValueBackupTaskTest { verify(mBackupManagerService).setWorkSource(null); verify(mObserver).onResult(PACKAGE_1.packageName, ERROR_AGENT_FAILURE); - verify(mObserver).backupFinished(BackupManager.SUCCESS); + verify(mObserver).backupFinished(SUCCESS); assertBackupPendingFor(PACKAGE_1); } @@ -810,7 +819,7 @@ public class KeyValueBackupTaskTest { verify(mBackupManagerService).setWorkSource(null); verify(mObserver).onResult(PACKAGE_1.packageName, ERROR_AGENT_FAILURE); - verify(mObserver).backupFinished(BackupManager.SUCCESS); + verify(mObserver).backupFinished(SUCCESS); assertBackupPendingFor(PACKAGE_1); } @@ -1316,7 +1325,8 @@ public class KeyValueBackupTaskTest { argThat(packageInfo(PM_PACKAGE)), any(), anyInt())) .then(copyBackupDataTo(backupDataPath)); BackupAgent pmAgent = spy(createPmAgent()); - doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent(); + doReturn(forward(pmAgent)).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); agentOnBackupDo( pmAgent, (oldState, dataOutput, newState) -> { @@ -1380,7 +1390,8 @@ public class KeyValueBackupTaskTest { setUpAgent(PACKAGE_1); when(transportMock.transport.finishBackup()).thenReturn(BackupTransport.TRANSPORT_OK); BackupAgent pmAgent = spy(createPmAgent()); - doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent(); + doReturn(forward(pmAgent)).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); agentOnBackupDo( pmAgent, (oldState, dataOutput, newState) -> { @@ -1404,7 +1415,8 @@ public class KeyValueBackupTaskTest { setUpAgent(PACKAGE_1); when(transportMock.transport.finishBackup()).thenReturn(BackupTransport.TRANSPORT_OK); BackupAgent pmAgent = spy(createPmAgent()); - doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent(); + doReturn(forward(pmAgent)).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); agentOnBackupDo( pmAgent, (oldState, dataOutput, newState) -> { @@ -1669,7 +1681,7 @@ public class KeyValueBackupTaskTest { verify(mReporter).onPackageBackupTransportFailure(PACKAGE_1.packageName); verify(mReporter).onTransportNotInitialized(mTransport.transportName); - verify(mReporter).onBackupFinished(BackupManager.ERROR_TRANSPORT_ABORTED); + verify(mReporter).onBackupFinished(ERROR_TRANSPORT_ABORTED); } @Test @@ -1686,7 +1698,7 @@ public class KeyValueBackupTaskTest { verify(mReporter).onPackageBackupTransportFailure(PM_PACKAGE.packageName); verify(mReporter).onTransportNotInitialized(mTransport.transportName); - verify(mReporter).onBackupFinished(BackupManager.ERROR_TRANSPORT_ABORTED); + verify(mReporter).onBackupFinished(ERROR_TRANSPORT_ABORTED); } @Test @@ -1983,7 +1995,8 @@ public class KeyValueBackupTaskTest { public void testRunTask_whenPmAgentFails_reportsCorrectly() throws Exception { TransportMock transportMock = setUpInitializedTransport(mTransport); BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException()); - when(mBackupManagerService.makeMetadataAgent()).thenReturn(pmAgent); + when(mBackupManagerService.makeMetadataAgentWithEligibilityRules( + mBackupEligibilityRules)).thenReturn(pmAgent); KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1); runTask(task); @@ -2001,7 +2014,8 @@ public class KeyValueBackupTaskTest { TransportMock transportMock = setUpInitializedTransport(mTransport); setUpAgent(PACKAGE_1); BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException()); - doReturn(pmAgent).when(mBackupManagerService).makeMetadataAgent(); + doReturn(pmAgent).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1); runTask(task); @@ -2014,7 +2028,8 @@ public class KeyValueBackupTaskTest { TransportMock transportMock = setUpInitializedTransport(mTransport); setUpAgent(PACKAGE_1); BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException()); - doReturn(pmAgent).when(mBackupManagerService).makeMetadataAgent(); + doReturn(pmAgent).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1); runTask(task); @@ -2027,7 +2042,8 @@ public class KeyValueBackupTaskTest { TransportMock transportMock = setUpInitializedTransport(mTransport); setUpAgent(PACKAGE_1); BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException()); - doReturn(pmAgent).when(mBackupManagerService).makeMetadataAgent(); + doReturn(pmAgent).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1); runTask(task); @@ -2040,7 +2056,8 @@ public class KeyValueBackupTaskTest { TransportMock transportMock = setUpInitializedTransport(mTransport); setUpAgent(PACKAGE_1); BackupAgent pmAgent = spy(createPmAgent()); - doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent(); + doReturn(forward(pmAgent)).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1); agentOnBackupDo( pmAgent, (oldState, dataOutput, newState) -> runInWorkerThread(task::markCancel)); @@ -2055,7 +2072,8 @@ public class KeyValueBackupTaskTest { TransportMock transportMock = setUpInitializedTransport(mTransport); setUpAgent(PACKAGE_1); BackupAgent pmAgent = spy(createPmAgent()); - doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent(); + doReturn(forward(pmAgent)).when(mBackupManagerService) + .makeMetadataAgentWithEligibilityRules(mBackupEligibilityRules); KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1); agentOnBackupDo( pmAgent, (oldState, dataOutput, newState) -> runInWorkerThread(task::markCancel)); @@ -2652,14 +2670,16 @@ public class KeyValueBackupTaskTest { mListener, emptyList(), /* userInitiated */ false, - nonIncremental); + nonIncremental, + mBackupEligibilityRules); mBackupManager.setUp(mBackupHandler, task); return task; } private PackageManagerBackupAgent createPmAgent() { PackageManagerBackupAgent pmAgent = - new PackageManagerBackupAgent(mApplication.getPackageManager(), USER_ID); + new PackageManagerBackupAgent(mApplication.getPackageManager(), USER_ID, + mBackupEligibilityRules); pmAgent.attach(mApplication); pmAgent.onCreate(); return pmAgent; @@ -2671,7 +2691,8 @@ public class KeyValueBackupTaskTest { */ private PackageManagerBackupAgent createThrowingPmAgent(RuntimeException exception) { PackageManagerBackupAgent pmAgent = - new ThrowingPackageManagerBackupAgent(mApplication.getPackageManager(), exception); + new ThrowingPackageManagerBackupAgent(mApplication.getPackageManager(), exception, + mBackupEligibilityRules); pmAgent.attach(mApplication); pmAgent.onCreate(); return pmAgent; @@ -2985,8 +3006,9 @@ public class KeyValueBackupTaskTest { private final RuntimeException mException; ThrowingPackageManagerBackupAgent( - PackageManager packageManager, RuntimeException exception) { - super(packageManager, USER_ID); + PackageManager packageManager, RuntimeException exception, + BackupEligibilityRules backupEligibilityRules) { + super(packageManager, USER_ID, backupEligibilityRules); mException = exception; } diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java b/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java deleted file mode 100644 index aa1c6688b01d8..0000000000000 --- a/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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.server.testing.shadows; - -import android.annotation.Nullable; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; - -import com.android.server.backup.transport.TransportClient; -import com.android.server.backup.utils.AppBackupUtils; - -import org.robolectric.annotation.Implementation; -import org.robolectric.annotation.Implements; -import org.robolectric.annotation.Resetter; - -import java.util.HashSet; -import java.util.Set; - -@Implements(AppBackupUtils.class) -public class ShadowAppBackupUtils { - private static final Set sAppsRunningAndEligibleForBackupWithTransport = - new HashSet<>(); - private static final Set sAppsEligibleForBackup = new HashSet<>(); - private static final Set sAppsGetFullBackup = new HashSet<>(); - - public static void setAppRunningAndEligibleForBackupWithTransport(String packageName) { - sAppsEligibleForBackup.add(packageName); - sAppsRunningAndEligibleForBackupWithTransport.add(packageName); - } - - public static void setAppEligibleForBackup(String packageName) { - sAppsEligibleForBackup.add(packageName); - } - - /** By default the app will be key-value. */ - public static void setAppGetsFullBackup(String packageName) { - sAppsGetFullBackup.add(packageName); - } - - @Implementation - protected static boolean appIsRunningAndEligibleForBackupWithTransport( - @Nullable TransportClient transportClient, - String packageName, - PackageManager pm, - int userId) { - return sAppsRunningAndEligibleForBackupWithTransport.contains(packageName); - } - - @Implementation - protected static boolean appIsEligibleForBackup(ApplicationInfo app, int userId, - int operationType) { - return sAppsEligibleForBackup.contains(app.packageName); - } - - @Implementation - protected static boolean appGetsFullBackup(PackageInfo packageInfo, int operationType) { - return sAppsGetFullBackup.contains(packageInfo.packageName); - } - - @Resetter - public static void reset() { - sAppsRunningAndEligibleForBackupWithTransport.clear(); - sAppsEligibleForBackup.clear(); - sAppsGetFullBackup.clear(); - } -} diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupTask.java b/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupTask.java index ac5d2da9c3cfb..fd51df7ab1f99 100644 --- a/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupTask.java +++ b/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupTask.java @@ -24,6 +24,7 @@ import com.android.server.backup.internal.OnTaskFinishedListener; import com.android.server.backup.keyvalue.KeyValueBackupReporter; import com.android.server.backup.keyvalue.KeyValueBackupTask; import com.android.server.backup.transport.TransportClient; +import com.android.server.backup.utils.BackupEligibilityRules; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; @@ -63,7 +64,8 @@ public class ShadowKeyValueBackupTask { OnTaskFinishedListener listener, List pendingFullBackups, boolean userInitiated, - boolean nonIncremental) { + boolean nonIncremental, + BackupEligibilityRules backupEligibilityRules) { mListener = listener; mQueue = queue; mPendingFullBackups = pendingFullBackups; diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowPerformUnifiedRestoreTask.java b/services/robotests/src/com/android/server/testing/shadows/ShadowPerformUnifiedRestoreTask.java index 8daef5fad0320..5161070398d70 100644 --- a/services/robotests/src/com/android/server/testing/shadows/ShadowPerformUnifiedRestoreTask.java +++ b/services/robotests/src/com/android/server/testing/shadows/ShadowPerformUnifiedRestoreTask.java @@ -25,6 +25,7 @@ import com.android.server.backup.UserBackupManagerService; import com.android.server.backup.internal.OnTaskFinishedListener; import com.android.server.backup.restore.PerformUnifiedRestoreTask; import com.android.server.backup.transport.TransportClient; +import com.android.server.backup.utils.BackupEligibilityRules; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; @@ -67,7 +68,8 @@ public class ShadowPerformUnifiedRestoreTask { int pmToken, boolean isFullSystemRestore, @Nullable String[] filterSet, - OnTaskFinishedListener listener) { + OnTaskFinishedListener listener, + BackupEligibilityRules backupEligibilityRules) { mBackupManagerService = backupManagerService; mPackage = targetPackage; mIsFullSystemRestore = isFullSystemRestore;