diff options
3 files changed, 40 insertions, 18 deletions
diff --git a/core/java/android/content/rollback/IRollbackManager.aidl b/core/java/android/content/rollback/IRollbackManager.aidl index 32e2198fa2df..104661f12e8d 100644 --- a/core/java/android/content/rollback/IRollbackManager.aidl +++ b/core/java/android/content/rollback/IRollbackManager.aidl @@ -32,7 +32,7 @@ interface IRollbackManager { // Exposed for use from the system server only. Callback from the package // manager during the install flow when user data can be restored for a given // package. - void restoreUserData(String packageName, int userId, int appId, long ceDataInode, + void restoreUserData(String packageName, in int[] userIds, int appId, long ceDataInode, String seInfo, int token); // Exposed for test purposes only. diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d2547d92e8b9..6f9a290a5b66 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -13883,6 +13883,9 @@ public class PackageManagerService extends IPackageManager.Stub final String packageName = res.pkg.applicationInfo.packageName; final String seInfo = res.pkg.applicationInfo.seInfo; + final int[] allUsers = sUserManager.getUserIds(); + final int[] installedUsers; + final PackageSetting ps; int appId = -1; long ceDataInode = -1; @@ -13892,11 +13895,16 @@ public class PackageManagerService extends IPackageManager.Stub appId = ps.appId; ceDataInode = ps.getCeDataInode(userId); } + + // NOTE: We ignore the user specified in the InstallParam because we know this is + // an update, and hence need to restore data for all installed users. + installedUsers = ps.queryInstalledUsers(allUsers, true); } if (ps != null) { try { - rm.restoreUserData(packageName, userId, appId, ceDataInode, seInfo, token); + rm.restoreUserData(packageName, installedUsers, appId, ceDataInode, + seInfo, token); } catch (RemoteException re) { // Cannot happen, the RollbackManager is hosted in the same process. } @@ -14593,6 +14601,17 @@ public class PackageManagerService extends IPackageManager.Stub TRACE_TAG_PACKAGE_MANAGER, "enable_rollback", enableRollbackToken); mPendingEnableRollback.append(enableRollbackToken, this); + final int[] installedUsers; + synchronized (mPackages) { + PackageSetting ps = mSettings.getPackageLPr(pkgLite.packageName); + if (ps != null) { + installedUsers = ps.queryInstalledUsers(sUserManager.getUserIds(), + true); + } else { + installedUsers = new int[0]; + } + } + // TODO(ruhler) b/112431924: What user? Test for multi-user. Intent enableRollbackIntent = new Intent(Intent.ACTION_PACKAGE_ENABLE_ROLLBACK); enableRollbackIntent.putExtra( @@ -14603,7 +14622,7 @@ public class PackageManagerService extends IPackageManager.Stub installFlags); enableRollbackIntent.putExtra( PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALLED_USERS, - resolveUserIds(args.user.getIdentifier())); + installedUsers); enableRollbackIntent.setDataAndType(Uri.fromFile(new File(origin.resolvedPath)), PACKAGE_MIME_TYPE); enableRollbackIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 5eb137b4c50c..46134001286f 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -783,7 +783,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } @Override - public void restoreUserData(String packageName, int userId, int appId, long ceDataInode, + public void restoreUserData(String packageName, int[] userIds, int appId, long ceDataInode, String seInfo, int token) { if (Binder.getCallingUid() != Process.SYSTEM_UID) { throw new SecurityException("restoureUserData may only be called by the system."); @@ -791,23 +791,26 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { getHandler().post(() -> { final RollbackData rollbackData = getRollbackForPackage(packageName); - final boolean changedRollbackData = mUserdataHelper.restoreAppData(packageName, - rollbackData, userId, appId, ceDataInode, seInfo); - final PackageManagerInternal pmi = LocalServices.getService( - PackageManagerInternal.class); - pmi.finishPackageInstall(token, false); + for (int userId : userIds) { + final boolean changedRollbackData = mUserdataHelper.restoreAppData(packageName, + rollbackData, userId, appId, ceDataInode, seInfo); - // We've updated metadata about this rollback, so save it to flash. - if (changedRollbackData) { - try { - mRollbackStore.saveAvailableRollback(rollbackData); - } catch (IOException ioe) { - // TODO(narayan): What is the right thing to do here ? This isn't a fatal error, - // since it will only result in us trying to restore data again, which will be - // a no-op if there's no data available. - Log.e(TAG, "Unable to save available rollback: " + packageName, ioe); + // We've updated metadata about this rollback, so save it to flash. + if (changedRollbackData) { + try { + mRollbackStore.saveAvailableRollback(rollbackData); + } catch (IOException ioe) { + // TODO(narayan): What is the right thing to do here ? This isn't a fatal + // error, since it will only result in us trying to restore data again, + // which will be a no-op if there's no data available. + Log.e(TAG, "Unable to save available rollback: " + packageName, ioe); + } } } + + final PackageManagerInternal pmi = LocalServices.getService( + PackageManagerInternal.class); + pmi.finishPackageInstall(token, false); }); } |