From f9c5bd837c14d597c54bb50c842410602cf14318 Mon Sep 17 00:00:00 2001 From: Ruslan Tkhakokhov Date: Fri, 24 Apr 2020 10:06:45 +0100 Subject: [PATCH] Skip backup/restore of wallpaper package Do not backup or restore wallpaper package when 'backup_skip_user_facing_data' is set. See https://b.corp.google.com/issues/153940088#comment2 for context. Bug: 153940088 Test: 1. atest UserBackupManagerServiceTest 2. atest PerformUnifiedRestoreTaskTest 3. atest CtsBackupTestCases 4. atest CtsBackupHostTestCases 5. Manual: 1) adb shell settings secure put backup_skip_user_facing_data 1 2) adb shell bmgr backupnow com.android.wallpaperbackup -> verify skipped 3) adb shell bmgr restore 1 com.android.wallpaperbackup -> verify skipped 4) adb shell settings secure put backup_skip_user_facing_data 0 -> verify com.android.wallpaperbackup is backed up / restored Change-Id: Iedd0c4030a635e294a04d35bd525ca852c929b92 --- .../backup/UserBackupManagerService.java | 37 +++++++++++++++ .../PerformFullTransportBackupTask.java | 5 +- .../restore/PerformUnifiedRestoreTask.java | 2 + .../backup/UserBackupManagerServiceTest.java | 46 +++++++++++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index 992e98473ae75..dc35c774f71e4 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -318,6 +318,9 @@ public class UserBackupManagerService { private static final String SERIAL_ID_FILE = "serial_id"; + private static final String SKIP_USER_FACING_DATA = "backup_skip_user_facing_data"; + private static final String WALLPAPER_PACKAGE = "com.android.wallpaperbackup"; + private final @UserIdInt int mUserId; private final BackupAgentTimeoutParameters mAgentTimeoutParameters; private final TransportManager mTransportManager; @@ -3553,6 +3556,40 @@ public class UserBackupManagerService { } } + /** + * We want to skip backup/restore of certain packages if 'backup_skip_user_facing_data' is + * set to true in secure settings. See b/153940088 for details. + * + * TODO(b/154822946): Remove this logic in the next release. + */ + public List filterUserFacingPackages(List packages) { + if (!shouldSkipUserFacingData()) { + return packages; + } + + List filteredPackages = new ArrayList<>(packages.size()); + for (PackageInfo packageInfo : packages) { + if (!shouldSkipPackage(packageInfo.packageName)) { + filteredPackages.add(packageInfo); + } else { + Slog.i(TAG, "Will skip backup/restore for " + packageInfo.packageName); + } + } + + return filteredPackages; + } + + @VisibleForTesting + public boolean shouldSkipUserFacingData() { + return Settings.Secure.getInt(mContext.getContentResolver(), SKIP_USER_FACING_DATA, + /* def */ 0) != 0; + } + + @VisibleForTesting + public boolean shouldSkipPackage(String packageName) { + return WALLPAPER_PACKAGE.equals(packageName); + } + private void updateStateForTransport(String newTransportName) { // Publish the name change Settings.Secure.putStringForUser(mContext.getContentResolver(), 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 f7f01387cf780..738dd9bf0f0df 100644 --- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java +++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java @@ -61,6 +61,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -131,7 +132,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba private UserBackupManagerService mUserBackupManagerService; private final Object mCancelLock = new Object(); - ArrayList mPackages; + List mPackages; PackageInfo mCurrentPackage; boolean mUpdateSchedule; CountDownLatch mLatch; @@ -249,6 +250,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba null); } } + + mPackages = backupManagerService.filterUserFacingPackages(mPackages); } private void registerTask() { 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 e434be648dcb9..12113fea12a44 100644 --- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java +++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java @@ -270,6 +270,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { } } + mAcceptSet = backupManagerService.filterUserFacingPackages(mAcceptSet); + if (MORE_DEBUG) { Slog.v(TAG, "Restore; accept set size is " + mAcceptSet.size()); for (PackageInfo info : mAcceptSet) { 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 fea61aa434427..dfe75ed50cd47 100644 --- a/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java +++ b/services/robotests/backup/src/com/android/server/backup/UserBackupManagerServiceTest.java @@ -30,10 +30,13 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; import static org.testng.Assert.expectThrows; import android.app.backup.BackupManager; @@ -86,6 +89,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -104,6 +108,7 @@ public class UserBackupManagerServiceTest { private static final String TAG = "BMSTest"; private static final String PACKAGE_1 = "some.package.1"; private static final String PACKAGE_2 = "some.package.2"; + private static final String USER_FACING_PACKAGE = "user.facing.package"; private static final int USER_ID = 10; @Mock private TransportManager mTransportManager; @@ -1186,6 +1191,47 @@ public class UserBackupManagerServiceTest { eq(packageTrackingReceiver), eq(UserHandle.of(USER_ID)), any(), any(), any()); } + @Test + public void testFilterUserFacingPackages_shouldSkipUserFacing_filtersUserFacing() { + List packages = Arrays.asList(getPackageInfo(USER_FACING_PACKAGE), + getPackageInfo(PACKAGE_1)); + UserBackupManagerService backupManagerService = spy( + createUserBackupManagerServiceAndRunTasks()); + when(backupManagerService.shouldSkipUserFacingData()).thenReturn(true); + when(backupManagerService.shouldSkipPackage(eq(USER_FACING_PACKAGE))).thenReturn(true); + + List filteredPackages = backupManagerService.filterUserFacingPackages( + packages); + + assertFalse(containsPackage(filteredPackages, USER_FACING_PACKAGE)); + assertTrue(containsPackage(filteredPackages, PACKAGE_1)); + } + + @Test + public void testFilterUserFacingPackages_shouldNotSkipUserFacing_doesNotFilterUserFacing() { + List packages = Arrays.asList(getPackageInfo(USER_FACING_PACKAGE), + getPackageInfo(PACKAGE_1)); + UserBackupManagerService backupManagerService = spy( + createUserBackupManagerServiceAndRunTasks()); + when(backupManagerService.shouldSkipUserFacingData()).thenReturn(false); + when(backupManagerService.shouldSkipPackage(eq(USER_FACING_PACKAGE))).thenReturn(true); + + List filteredPackages = backupManagerService.filterUserFacingPackages( + packages); + + assertTrue(containsPackage(filteredPackages, USER_FACING_PACKAGE)); + assertTrue(containsPackage(filteredPackages, PACKAGE_1)); + } + + private static boolean containsPackage(List packages, String targetPackage) { + for (PackageInfo packageInfo : packages) { + if (targetPackage.equals(packageInfo.packageName)) { + return true; + } + } + return false; + } + private UserBackupManagerService createUserBackupManagerServiceAndRunTasks() { return BackupManagerServiceTestUtils.createUserBackupManagerServiceAndRunTasks( USER_ID, mContext, mBackupThread, mBaseStateDir, mDataDir, mTransportManager);