summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java6
-rw-r--r--services/core/java/com/android/server/pm/PackageSetting.java23
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