diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/InstallPackageHelper.java | 6 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageSetting.java | 23 |
2 files changed, 29 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 992d8eb8b1bb..9634d5ec7710 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -575,6 +575,12 @@ final class InstallPackageHelper { mApexManager.registerApkInApex(pkg); } + if ((mPm.isDeviceUpgrading() && pkgSetting.isSystem()) || isReplace) { + for (int userId : mPm.mUserManager.getUserIds()) { + pkgSetting.restoreComponentSettings(userId); + } + } + // Don't add keysets for APEX as their package settings are not persisted and will // result in orphaned keysets. if ((scanFlags & SCAN_AS_APEX) == 0) { diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 45fc49a2e855..74c482b47745 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -1112,6 +1112,29 @@ public class PackageSetting extends SettingBase implements PackageStateInternal return changed; } + void restoreComponentSettings(int userId) { + PackageUserStateImpl state = modifyUserStateComponents(userId, true, true); + WatchedArraySet<String> enabledComponents = state.getEnabledComponentsNoCopy(); + WatchedArraySet<String> disabledComponents = state.getDisabledComponentsNoCopy(); + + boolean changed = false; + for (int i = enabledComponents.size() - 1; i >= 0; i--) { + if (!AndroidPackageUtils.hasComponentClassName(pkg, enabledComponents.valueAt(i))) { + enabledComponents.removeAt(i); + changed = true; + } + } + for (int i = disabledComponents.size() - 1; i >= 0; i--) { + if (!AndroidPackageUtils.hasComponentClassName(pkg, disabledComponents.valueAt(i))) { + disabledComponents.removeAt(i); + changed = true; + } + } + if (changed) { + onChanged(); + } + } + int getCurrentEnabledStateLPr(String componentName, int userId) { PackageUserStateInternal state = readUserState(userId); if (state.getEnabledComponentsNoCopy() != null |