Loading services/core/java/com/android/server/pm/DeletePackageHelper.java +11 −13 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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 Loading Loading @@ -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, Loading services/core/java/com/android/server/pm/InstallPackageHelper.java +31 −25 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading @@ -3472,13 +3476,14 @@ 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 { 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()); Loading @@ -3493,6 +3498,7 @@ final class InstallPackageHelper { } } } } @GuardedBy("mPm.mLock") private void disableStubPackage(DeletePackageAction action, PackageSetting deletedPs, Loading services/core/java/com/android/server/pm/Settings.java +9 −4 Original line number Diff line number Diff line Loading @@ -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); if (mSharedUsers.remove(s.name) != null) { removeAppIdLPw(s.userId); return true; } } return false; } int removePackageLPw(String name) { Loading @@ -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(); Loading Loading
services/core/java/com/android/server/pm/DeletePackageHelper.java +11 −13 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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 Loading Loading @@ -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, Loading
services/core/java/com/android/server/pm/InstallPackageHelper.java +31 −25 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading @@ -3472,13 +3476,14 @@ 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 { 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()); Loading @@ -3493,6 +3498,7 @@ final class InstallPackageHelper { } } } } @GuardedBy("mPm.mLock") private void disableStubPackage(DeletePackageAction action, PackageSetting deletedPs, Loading
services/core/java/com/android/server/pm/Settings.java +9 −4 Original line number Diff line number Diff line Loading @@ -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); if (mSharedUsers.remove(s.name) != null) { removeAppIdLPw(s.userId); return true; } } return false; } int removePackageLPw(String name) { Loading @@ -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(); Loading