Loading services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java +13 −17 Original line number Diff line number Diff line Loading @@ -71,6 +71,14 @@ public class BackupEligibilityRules { @EnabledSince(targetSdkVersion = Build.VERSION_CODES.S) static final long RESTRICT_ADB_BACKUP = 171032338L; /** * When this change is enabled, {@code android:allowBackup} is ignored for apps during D2D * (device-to-device) migrations. */ @ChangeId @EnabledSince(targetSdkVersion = Build.VERSION_CODES.S) static final long IGNORE_ALLOW_BACKUP_IN_D2D = 183147249L; public static BackupEligibilityRules forBackup(PackageManager packageManager, PackageManagerInternal packageManagerInternal, int userId) { Loading Loading @@ -148,13 +156,15 @@ public class BackupEligibilityRules { * @return boolean indicating whether backup is allowed. */ public boolean isAppBackupAllowed(ApplicationInfo app) { boolean isSystemApp = UserHandle.isCore(app.uid); boolean allowBackup = (app.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0; switch (mOperationType) { case OperationType.MIGRATION: // Backup / restore of all non-system apps is force allowed during // device-to-device migration. return !isSystemApp || allowBackup; boolean isSystemApp = (app.flags & ApplicationInfo.FLAG_SYSTEM) != 0; boolean ignoreAllowBackup = !isSystemApp && CompatChanges.isChangeEnabled( IGNORE_ALLOW_BACKUP_IN_D2D, app.packageName, UserHandle.of(mUserId)); return ignoreAllowBackup || allowBackup; case OperationType.ADB_BACKUP: String packageName = app.packageName; if (packageName == null) { Loading @@ -176,7 +186,7 @@ public class BackupEligibilityRules { boolean isPrivileged = (app.flags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0; boolean isDebuggable = (app.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; if (isSystemApp || isPrivileged) { if (UserHandle.isCore(app.uid) || isPrivileged) { try { return mPackageManager.getProperty(PackageManager.PROPERTY_ALLOW_ADB_BACKUP, packageName).getBoolean(); Loading Loading @@ -283,11 +293,6 @@ public class BackupEligibilityRules { */ @VisibleForTesting 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; } if (pkg.applicationInfo.backupAgentName != null) { // If it has an agent, it gets full backups only if it says so return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_FULL_BACKUP_ONLY) != 0; Loading @@ -297,15 +302,6 @@ public class BackupEligibilityRules { return true; } public boolean appIgnoresIncludeExcludeRules(ApplicationInfo app) { return forceFullBackup(app.uid, mOperationType); } private boolean forceFullBackup(int appUid, @OperationType int operationType) { return operationType == OperationType.MIGRATION && !UserHandle.isCore(appUid); } /** * 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. Loading services/tests/servicestests/src/com/android/server/backup/utils/BackupEligibilityRulesTest.java +2 −75 Original line number Diff line number Diff line Loading @@ -219,6 +219,7 @@ public class BackupEligibilityRulesTest { } @Test @EnableCompatChanges({BackupEligibilityRules.IGNORE_ALLOW_BACKUP_IN_D2D}) public void appIsEligibleForBackup_backupNotAllowedAndInMigration_returnsTrue() throws Exception { ApplicationInfo applicationInfo = getApplicationInfo(Process.FIRST_APPLICATION_UID, Loading @@ -235,7 +236,7 @@ public class BackupEligibilityRulesTest { public void appIsEligibleForBackup_backupNotAllowedForSystemAppAndInMigration_returnsFalse() throws Exception { ApplicationInfo applicationInfo = getApplicationInfo(Process.SYSTEM_UID, /* flags */ 0, CUSTOM_BACKUP_AGENT_NAME); ApplicationInfo.FLAG_SYSTEM, CUSTOM_BACKUP_AGENT_NAME); BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean isEligible = eligibilityRules.appIsEligibleForBackup(applicationInfo); Loading Loading @@ -477,34 +478,6 @@ public class BackupEligibilityRulesTest { assertThat(result).isFalse(); } @Test public void appGetsFullBackup_withCustomBackupAgentAndWithoutFullBackupOnlyFlagAndInMigration_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = getApplicationInfo(Process.FIRST_APPLICATION_UID, ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY, CUSTOM_BACKUP_AGENT_NAME); BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean result = eligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @Test public void appGetsFullBackup_systemAppWithCustomBackupAgentAndWithoutFullBackupOnlyFlagAndInMigration_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = getApplicationInfo(Process.SYSTEM_UID, ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY, CUSTOM_BACKUP_AGENT_NAME); BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean result = eligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isFalse(); } @Test public void appIsKeyValueOnly_noCustomBackupAgent_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); Loading Loading @@ -542,52 +515,6 @@ public class BackupEligibilityRulesTest { assertThat(result).isTrue(); } @Test public void appIgnoresIncludeExcludeRules_systemAppAndInMigration_returnsFalse() { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.SYSTEM_UID; BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @Test public void appIgnoresIncludeExcludeRules_systemAppInBackup_returnsFalse() { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.SYSTEM_UID; BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @Test public void appIgnoresIncludeExcludeRules_nonSystemAppInMigration_returnsTrue() { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.FIRST_APPLICATION_UID; BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isTrue(); } @Test public void appIgnoresIncludeExcludeRules_nonSystemInBackup_returnsFalse() { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.FIRST_APPLICATION_UID; boolean result = mBackupEligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_targetIsNull_returnsFalse() throws Exception { boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1}, null); Loading Loading
services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java +13 −17 Original line number Diff line number Diff line Loading @@ -71,6 +71,14 @@ public class BackupEligibilityRules { @EnabledSince(targetSdkVersion = Build.VERSION_CODES.S) static final long RESTRICT_ADB_BACKUP = 171032338L; /** * When this change is enabled, {@code android:allowBackup} is ignored for apps during D2D * (device-to-device) migrations. */ @ChangeId @EnabledSince(targetSdkVersion = Build.VERSION_CODES.S) static final long IGNORE_ALLOW_BACKUP_IN_D2D = 183147249L; public static BackupEligibilityRules forBackup(PackageManager packageManager, PackageManagerInternal packageManagerInternal, int userId) { Loading Loading @@ -148,13 +156,15 @@ public class BackupEligibilityRules { * @return boolean indicating whether backup is allowed. */ public boolean isAppBackupAllowed(ApplicationInfo app) { boolean isSystemApp = UserHandle.isCore(app.uid); boolean allowBackup = (app.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0; switch (mOperationType) { case OperationType.MIGRATION: // Backup / restore of all non-system apps is force allowed during // device-to-device migration. return !isSystemApp || allowBackup; boolean isSystemApp = (app.flags & ApplicationInfo.FLAG_SYSTEM) != 0; boolean ignoreAllowBackup = !isSystemApp && CompatChanges.isChangeEnabled( IGNORE_ALLOW_BACKUP_IN_D2D, app.packageName, UserHandle.of(mUserId)); return ignoreAllowBackup || allowBackup; case OperationType.ADB_BACKUP: String packageName = app.packageName; if (packageName == null) { Loading @@ -176,7 +186,7 @@ public class BackupEligibilityRules { boolean isPrivileged = (app.flags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0; boolean isDebuggable = (app.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; if (isSystemApp || isPrivileged) { if (UserHandle.isCore(app.uid) || isPrivileged) { try { return mPackageManager.getProperty(PackageManager.PROPERTY_ALLOW_ADB_BACKUP, packageName).getBoolean(); Loading Loading @@ -283,11 +293,6 @@ public class BackupEligibilityRules { */ @VisibleForTesting 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; } if (pkg.applicationInfo.backupAgentName != null) { // If it has an agent, it gets full backups only if it says so return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_FULL_BACKUP_ONLY) != 0; Loading @@ -297,15 +302,6 @@ public class BackupEligibilityRules { return true; } public boolean appIgnoresIncludeExcludeRules(ApplicationInfo app) { return forceFullBackup(app.uid, mOperationType); } private boolean forceFullBackup(int appUid, @OperationType int operationType) { return operationType == OperationType.MIGRATION && !UserHandle.isCore(appUid); } /** * 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. Loading
services/tests/servicestests/src/com/android/server/backup/utils/BackupEligibilityRulesTest.java +2 −75 Original line number Diff line number Diff line Loading @@ -219,6 +219,7 @@ public class BackupEligibilityRulesTest { } @Test @EnableCompatChanges({BackupEligibilityRules.IGNORE_ALLOW_BACKUP_IN_D2D}) public void appIsEligibleForBackup_backupNotAllowedAndInMigration_returnsTrue() throws Exception { ApplicationInfo applicationInfo = getApplicationInfo(Process.FIRST_APPLICATION_UID, Loading @@ -235,7 +236,7 @@ public class BackupEligibilityRulesTest { public void appIsEligibleForBackup_backupNotAllowedForSystemAppAndInMigration_returnsFalse() throws Exception { ApplicationInfo applicationInfo = getApplicationInfo(Process.SYSTEM_UID, /* flags */ 0, CUSTOM_BACKUP_AGENT_NAME); ApplicationInfo.FLAG_SYSTEM, CUSTOM_BACKUP_AGENT_NAME); BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean isEligible = eligibilityRules.appIsEligibleForBackup(applicationInfo); Loading Loading @@ -477,34 +478,6 @@ public class BackupEligibilityRulesTest { assertThat(result).isFalse(); } @Test public void appGetsFullBackup_withCustomBackupAgentAndWithoutFullBackupOnlyFlagAndInMigration_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = getApplicationInfo(Process.FIRST_APPLICATION_UID, ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY, CUSTOM_BACKUP_AGENT_NAME); BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean result = eligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @Test public void appGetsFullBackup_systemAppWithCustomBackupAgentAndWithoutFullBackupOnlyFlagAndInMigration_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = getApplicationInfo(Process.SYSTEM_UID, ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY, CUSTOM_BACKUP_AGENT_NAME); BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean result = eligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isFalse(); } @Test public void appIsKeyValueOnly_noCustomBackupAgent_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); Loading Loading @@ -542,52 +515,6 @@ public class BackupEligibilityRulesTest { assertThat(result).isTrue(); } @Test public void appIgnoresIncludeExcludeRules_systemAppAndInMigration_returnsFalse() { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.SYSTEM_UID; BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @Test public void appIgnoresIncludeExcludeRules_systemAppInBackup_returnsFalse() { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.SYSTEM_UID; BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @Test public void appIgnoresIncludeExcludeRules_nonSystemAppInMigration_returnsTrue() { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.FIRST_APPLICATION_UID; BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isTrue(); } @Test public void appIgnoresIncludeExcludeRules_nonSystemInBackup_returnsFalse() { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.FIRST_APPLICATION_UID; boolean result = mBackupEligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_targetIsNull_returnsFalse() throws Exception { boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1}, null); Loading