OSDN Git Service

[Multi-user] Support permission backup for multi-user
authorRuslan Tkhakokhov <rthakohov@google.com>
Wed, 30 Jan 2019 09:19:13 +0000 (09:19 +0000)
committerRuslan Tkhakokhov <rthakohov@google.com>
Mon, 4 Feb 2019 20:03:30 +0000 (20:03 +0000)
Bug: 123349308
Test: 1) atest RunBackupFrameworksServicesRoboTests
         2) atest CtsBackupTestCases
         3) atest CtsBackupHostTestCases
         4) atest GtsBackupTestCases
         5) atest GtsBackupHostTestCases

Manual testing (for system/secondary users):
  * Install Textra Sms (third-party sms client, requires sms
  permissions) and give permissions
  * adb shell bmgr --user [user-id] backupnow android
  * Uninstall and reinstall the app
  * abd shell bmgr --user [user-id] restore [token] android
  * Launch the app and verify permission dialog doesn't appear

Change-Id: I61ec4eb9c593465363dcf43059584b15f4aa81f5

core/java/com/android/server/backup/PermissionBackupHelper.java
core/java/com/android/server/backup/SystemBackupAgent.java

index ff0e63d..c0ba181 100644 (file)
@@ -19,7 +19,6 @@ package com.android.server.backup;
 import android.app.AppGlobals;
 import android.app.backup.BlobBackupHelper;
 import android.content.pm.IPackageManager;
-import android.os.UserHandle;
 import android.util.Slog;
 
 public class PermissionBackupHelper extends BlobBackupHelper {
@@ -32,8 +31,12 @@ public class PermissionBackupHelper extends BlobBackupHelper {
     // key under which the permission-grant state blob is committed to backup
     private static final String KEY_PERMISSIONS = "permissions";
 
-    public PermissionBackupHelper() {
+    private final int mUserId;
+
+    public PermissionBackupHelper(int userId) {
         super(STATE_VERSION, KEY_PERMISSIONS);
+
+        mUserId = userId;
     }
 
     @Override
@@ -45,7 +48,7 @@ public class PermissionBackupHelper extends BlobBackupHelper {
         try {
             switch (key) {
                 case KEY_PERMISSIONS:
-                    return pm.getPermissionGrantBackup(UserHandle.USER_SYSTEM);
+                    return pm.getPermissionGrantBackup(mUserId);
 
                 default:
                     Slog.w(TAG, "Unexpected backup key " + key);
@@ -65,7 +68,7 @@ public class PermissionBackupHelper extends BlobBackupHelper {
         try {
             switch (key) {
                 case KEY_PERMISSIONS:
-                    pm.restorePermissionGrants(payload, UserHandle.USER_SYSTEM);
+                    pm.restorePermissionGrants(payload, mUserId);
                     break;
 
                 default:
index 47e7a0e..8878421 100644 (file)
@@ -19,7 +19,7 @@ package com.android.server.backup;
 import android.app.IWallpaperManager;
 import android.app.backup.BackupAgentHelper;
 import android.app.backup.BackupDataInput;
-import android.app.backup.BackupDataOutput;
+import android.app.backup.BackupHelper;
 import android.app.backup.FullBackup;
 import android.app.backup.FullBackupDataOutput;
 import android.app.backup.WallpaperBackupHelper;
@@ -31,8 +31,11 @@ import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.util.Slog;
 
+import com.google.android.collect.Sets;
+
 import java.io.File;
 import java.io.IOException;
+import java.util.Set;
 
 /**
  * Backup agent for various system-managed data.  Wallpapers are now handled by a
@@ -77,20 +80,25 @@ public class SystemBackupAgent extends BackupAgentHelper {
     // Use old keys to keep legacy data compatibility and avoid writing two wallpapers
     private static final String WALLPAPER_IMAGE_KEY = WallpaperBackupHelper.WALLPAPER_IMAGE_KEY;
 
-    private WallpaperBackupHelper mWallpaperHelper = null;
+    private static final Set<String> sEligibleForMultiUser = Sets.newArraySet(
+            PERMISSION_HELPER);
+
+    private int mUserId = UserHandle.USER_SYSTEM;
 
     @Override
-    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
-            ParcelFileDescriptor newState) throws IOException {
+    public void onCreate(UserHandle user) {
+        super.onCreate(user);
+
+        mUserId = user.getIdentifier();
+
         addHelper(SYNC_SETTINGS_HELPER, new AccountSyncSettingsBackupHelper(this));
         addHelper(PREFERRED_HELPER, new PreferredActivityBackupHelper());
         addHelper(NOTIFICATION_HELPER, new NotificationBackupHelper(this));
-        addHelper(PERMISSION_HELPER, new PermissionBackupHelper());
+        addHelper(PERMISSION_HELPER, new PermissionBackupHelper(mUserId));
         addHelper(USAGE_STATS_HELPER, new UsageStatsBackupHelper(this));
         addHelper(SHORTCUT_MANAGER_HELPER, new ShortcutBackupHelper());
         addHelper(ACCOUNT_MANAGER_HELPER, new AccountManagerBackupHelper());
         addHelper(SLICES_HELPER, new SliceBackupHelper(this));
-        super.onBackup(oldState, data, newState);
     }
 
     @Override
@@ -103,26 +111,25 @@ public class SystemBackupAgent extends BackupAgentHelper {
             throws IOException {
         // Slot in a restore helper for the older wallpaper backup schema to support restore
         // from devices still generating data in that format.
-        mWallpaperHelper = new WallpaperBackupHelper(this,
-                new String[] { WALLPAPER_IMAGE_KEY} );
-        addHelper(WALLPAPER_HELPER, mWallpaperHelper);
+        addHelper(WALLPAPER_HELPER, new WallpaperBackupHelper(this,
+                new String[] { WALLPAPER_IMAGE_KEY}));
 
         // On restore, we also support a long-ago wallpaper data schema "system_files"
         addHelper("system_files", new WallpaperBackupHelper(this,
                 new String[] { WALLPAPER_IMAGE_KEY} ));
 
-        addHelper(SYNC_SETTINGS_HELPER, new AccountSyncSettingsBackupHelper(this));
-        addHelper(PREFERRED_HELPER, new PreferredActivityBackupHelper());
-        addHelper(NOTIFICATION_HELPER, new NotificationBackupHelper(this));
-        addHelper(PERMISSION_HELPER, new PermissionBackupHelper());
-        addHelper(USAGE_STATS_HELPER, new UsageStatsBackupHelper(this));
-        addHelper(SHORTCUT_MANAGER_HELPER, new ShortcutBackupHelper());
-        addHelper(ACCOUNT_MANAGER_HELPER, new AccountManagerBackupHelper());
-        addHelper(SLICES_HELPER, new SliceBackupHelper(this));
-
         super.onRestore(data, appVersionCode, newState);
     }
 
+    @Override
+    public void addHelper(String keyPrefix, BackupHelper helper) {
+        if (mUserId != UserHandle.USER_SYSTEM && !sEligibleForMultiUser.contains(keyPrefix)) {
+            return;
+        }
+
+        super.addHelper(keyPrefix, helper);
+    }
+
     /**
      * Support for 'adb restore' of legacy archives
      */