diff options
3 files changed, 51 insertions, 42 deletions
diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index e8922ebbfd13..8fda109a83ce 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -431,10 +431,9 @@ final class DeletePackageHelper { if (DEBUG_REMOVE) Slog.d(TAG, "Removing system package: " + ps.getPackageName()); // When an updated system application is deleted we delete the existing resources // as well and fall back to existing code in system partition - PackageSetting disabledPs = deleteInstalledSystemPackage(action, ps, allUserHandles, - flags, outInfo, writeSettings); + deleteInstalledSystemPackage(action, allUserHandles, writeSettings); new InstallPackageHelper(mPm).restoreDisabledSystemPackageLIF( - action, ps, allUserHandles, outInfo, writeSettings, disabledPs); + action, allUserHandles, writeSettings); } else { if (DEBUG_REMOVE) Slog.d(TAG, "Removing non-system package: " + ps.getPackageName()); deleteInstalledPackageLIF(ps, deleteCodeAndResources, flags, allUserHandles, @@ -561,10 +560,11 @@ final class DeletePackageHelper { mPm.mSettings.writeKernelMappingLPr(ps); } - private PackageSetting deleteInstalledSystemPackage(DeletePackageAction action, - PackageSetting deletedPs, - @NonNull int[] allUserHandles, int flags, @Nullable PackageRemovedInfo outInfo, - boolean writeSettings) { + private void deleteInstalledSystemPackage(DeletePackageAction action, + @NonNull int[] allUserHandles, boolean writeSettings) { + int flags = action.mFlags; + final PackageSetting deletedPs = action.mDeletingPs; + final PackageRemovedInfo outInfo = action.mRemovedInfo; final boolean applyUserRestrictions = outInfo != null && (outInfo.mOrigUsers != null); final AndroidPackage deletedPkg = deletedPs.getPkg(); // Confirm if the system package has been updated @@ -593,18 +593,16 @@ final class DeletePackageHelper { outInfo.mIsRemovedPackageSystemUpdate = true; } - if (disabledPs.getVersionCode() < deletedPs.getVersionCode()) { - // Delete data for downgrades + if (disabledPs.getVersionCode() < deletedPs.getVersionCode() + || disabledPs.getAppId() != deletedPs.getAppId()) { + // Delete data for downgrades, or when the system app changed appId flags &= ~PackageManager.DELETE_KEEP_DATA; } else { // Preserve data by setting flag flags |= PackageManager.DELETE_KEEP_DATA; } - deleteInstalledPackageLIF(deletedPs, true, flags, allUserHandles, - outInfo, writeSettings); - - return disabledPs; + deleteInstalledPackageLIF(deletedPs, true, flags, allUserHandles, outInfo, writeSettings); } public void deletePackageVersionedInternal(VersionedPackage versionedPackage, diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index fce37a9f2345..24052532dfa3 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -494,7 +494,13 @@ final class InstallPackageHelper { if (request.mPkgSetting != null && request.mPkgSetting.getSharedUser() != null && request.mPkgSetting.getSharedUser() != result.mPkgSetting.getSharedUser()) { // shared user changed, remove from old shared user - request.mPkgSetting.getSharedUser().removePackage(request.mPkgSetting); + final SharedUserSetting sus = request.mPkgSetting.getSharedUser(); + sus.removePackage(request.mPkgSetting); + // Prune unused SharedUserSetting + if (mPm.mSettings.checkAndPruneSharedUserLPw(sus, false)) { + // Set the app ID in removed info for UID_REMOVED broadcasts + reconciledPkg.mInstallResult.mRemovedInfo.mRemovedAppId = sus.userId; + } } if (result.mExistingSettingCopied) { pkgSetting = request.mPkgSetting; @@ -3455,14 +3461,12 @@ final class InstallPackageHelper { /** * Tries to restore the disabled system package after an update has been deleted. */ - @GuardedBy({"mPm.mLock", "mPm.mInstallLock"}) public void restoreDisabledSystemPackageLIF(DeletePackageAction action, - PackageSetting deletedPs, @NonNull int[] allUserHandles, - @Nullable PackageRemovedInfo outInfo, - boolean writeSettings, - PackageSetting disabledPs) - throws SystemDeleteException { - // writer + @NonNull int[] allUserHandles, boolean writeSettings) throws SystemDeleteException { + final PackageSetting deletedPs = action.mDeletingPs; + final PackageRemovedInfo outInfo = action.mRemovedInfo; + final PackageSetting disabledPs = action.mDisabledPs; + synchronized (mPm.mLock) { // NOTE: The system package always needs to be enabled; even if it's for // a compressed stub. If we don't, installing the system package fails @@ -3472,24 +3476,26 @@ final class InstallPackageHelper { mPm.mSettings.enableSystemPackageLPw(disabledPs.getPkg().getPackageName()); // Remove any native libraries from the upgraded package. removeNativeBinariesLI(deletedPs); - } - // Install the system package - if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs); - try { - installPackageFromSystemLIF(disabledPs.getPathString(), allUserHandles, - outInfo == null ? null : outInfo.mOrigUsers, writeSettings); - } catch (PackageManagerException e) { - Slog.w(TAG, "Failed to restore system package:" + deletedPs.getPackageName() + ": " - + e.getMessage()); - // TODO(b/194319951): can we avoid this; throw would come from scan... - throw new SystemDeleteException(e); - } finally { - if (disabledPs.getPkg().isStub()) { - // We've re-installed the stub; make sure it's disabled here. If package was - // originally enabled, we'll install the compressed version of the application - // and re-enable it afterward. - disableStubPackage(action, deletedPs, allUserHandles); + // Install the system package + if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs); + try { + synchronized (mPm.mInstallLock) { + installPackageFromSystemLIF(disabledPs.getPathString(), allUserHandles, + outInfo == null ? null : outInfo.mOrigUsers, writeSettings); + } + } catch (PackageManagerException e) { + Slog.w(TAG, "Failed to restore system package:" + deletedPs.getPackageName() + ": " + + e.getMessage()); + // TODO(b/194319951): can we avoid this; throw would come from scan... + throw new SystemDeleteException(e); + } finally { + if (disabledPs.getPkg().isStub()) { + // We've re-installed the stub; make sure it's disabled here. If package was + // originally enabled, we'll install the compressed version of the application + // and re-enable it afterward. + disableStubPackage(action, deletedPs, allUserHandles); + } } } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 45994f65d697..b1ce6a2a5366 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -1254,11 +1254,14 @@ public final class Settings implements Watchable, Snappable { } } - private void checkAndPruneSharedUserLPw(SharedUserSetting s, boolean skipCheck) { + boolean checkAndPruneSharedUserLPw(SharedUserSetting s, boolean skipCheck) { if (skipCheck || (s.packages.isEmpty() && s.mDisabledPackages.isEmpty())) { - mSharedUsers.remove(s.name); - removeAppIdLPw(s.userId); + if (mSharedUsers.remove(s.name) != null) { + removeAppIdLPw(s.userId); + return true; + } } + return false; } int removePackageLPw(String name) { @@ -1267,7 +1270,9 @@ public final class Settings implements Watchable, Snappable { removeInstallerPackageStatus(name); if (p.getSharedUser() != null) { p.getSharedUser().removePackage(p); - checkAndPruneSharedUserLPw(p.getSharedUser(), false); + if (checkAndPruneSharedUserLPw(p.getSharedUser(), false)) { + return p.getSharedUser().userId; + } } else { removeAppIdLPw(p.getAppId()); return p.getAppId(); |