summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/DeletePackageHelper.java24
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java56
-rw-r--r--services/core/java/com/android/server/pm/Settings.java13
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();