Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37f4c472 authored by John Wu's avatar John Wu
Browse files

Cleanup omissions when adding app ID migration to PMS

Follow up after multiple changes for leaving sharedUserId

- Cleanup some messy APIs in DeletePackageHelper
- Remove the SharedUserSetting if no apps remains in the group
- Set PackageRemovedInfo.mRemovedAppId when UID is removed
- Always delete app data when app ID changes during a downgrade
- Fix locking in restoreDisabledSystemPackageLIF(...)

Test: Build + TH
Bug: 179284822
Change-Id: I40853a0894788ede6e0755984d463d2212ec9f09
parent 484a8790
Loading
Loading
Loading
Loading
+11 −13
Original line number Original line Diff line number Diff line
@@ -431,10 +431,9 @@ final class DeletePackageHelper {
            if (DEBUG_REMOVE) Slog.d(TAG, "Removing system package: " + ps.getPackageName());
            if (DEBUG_REMOVE) Slog.d(TAG, "Removing system package: " + ps.getPackageName());
            // When an updated system application is deleted we delete the existing resources
            // When an updated system application is deleted we delete the existing resources
            // as well and fall back to existing code in system partition
            // as well and fall back to existing code in system partition
            PackageSetting disabledPs = deleteInstalledSystemPackage(action, ps, allUserHandles,
            deleteInstalledSystemPackage(action, allUserHandles, writeSettings);
                    flags, outInfo, writeSettings);
            new InstallPackageHelper(mPm).restoreDisabledSystemPackageLIF(
            new InstallPackageHelper(mPm).restoreDisabledSystemPackageLIF(
                    action, ps, allUserHandles, outInfo, writeSettings, disabledPs);
                    action, allUserHandles, writeSettings);
        } else {
        } else {
            if (DEBUG_REMOVE) Slog.d(TAG, "Removing non-system package: " + ps.getPackageName());
            if (DEBUG_REMOVE) Slog.d(TAG, "Removing non-system package: " + ps.getPackageName());
            deleteInstalledPackageLIF(ps, deleteCodeAndResources, flags, allUserHandles,
            deleteInstalledPackageLIF(ps, deleteCodeAndResources, flags, allUserHandles,
@@ -561,10 +560,11 @@ final class DeletePackageHelper {
        mPm.mSettings.writeKernelMappingLPr(ps);
        mPm.mSettings.writeKernelMappingLPr(ps);
    }
    }


    private PackageSetting deleteInstalledSystemPackage(DeletePackageAction action,
    private void deleteInstalledSystemPackage(DeletePackageAction action,
            PackageSetting deletedPs,
            @NonNull int[] allUserHandles, boolean writeSettings) {
            @NonNull int[] allUserHandles, int flags, @Nullable PackageRemovedInfo outInfo,
        int flags = action.mFlags;
            boolean writeSettings) {
        final PackageSetting deletedPs = action.mDeletingPs;
        final PackageRemovedInfo outInfo = action.mRemovedInfo;
        final boolean applyUserRestrictions = outInfo != null && (outInfo.mOrigUsers != null);
        final boolean applyUserRestrictions = outInfo != null && (outInfo.mOrigUsers != null);
        final AndroidPackage deletedPkg = deletedPs.getPkg();
        final AndroidPackage deletedPkg = deletedPs.getPkg();
        // Confirm if the system package has been updated
        // Confirm if the system package has been updated
@@ -593,18 +593,16 @@ final class DeletePackageHelper {
            outInfo.mIsRemovedPackageSystemUpdate = true;
            outInfo.mIsRemovedPackageSystemUpdate = true;
        }
        }


        if (disabledPs.getVersionCode() < deletedPs.getVersionCode()) {
        if (disabledPs.getVersionCode() < deletedPs.getVersionCode()
            // Delete data for downgrades
                || disabledPs.getAppId() != deletedPs.getAppId()) {
            // Delete data for downgrades, or when the system app changed appId
            flags &= ~PackageManager.DELETE_KEEP_DATA;
            flags &= ~PackageManager.DELETE_KEEP_DATA;
        } else {
        } else {
            // Preserve data by setting flag
            // Preserve data by setting flag
            flags |= PackageManager.DELETE_KEEP_DATA;
            flags |= PackageManager.DELETE_KEEP_DATA;
        }
        }


        deleteInstalledPackageLIF(deletedPs, true, flags, allUserHandles,
        deleteInstalledPackageLIF(deletedPs, true, flags, allUserHandles, outInfo, writeSettings);
                outInfo, writeSettings);

        return disabledPs;
    }
    }


    public void deletePackageVersionedInternal(VersionedPackage versionedPackage,
    public void deletePackageVersionedInternal(VersionedPackage versionedPackage,
+31 −25
Original line number Original line Diff line number Diff line
@@ -494,7 +494,13 @@ final class InstallPackageHelper {
        if (request.mPkgSetting != null && request.mPkgSetting.getSharedUser() != null
        if (request.mPkgSetting != null && request.mPkgSetting.getSharedUser() != null
                && request.mPkgSetting.getSharedUser() != result.mPkgSetting.getSharedUser()) {
                && request.mPkgSetting.getSharedUser() != result.mPkgSetting.getSharedUser()) {
            // shared user changed, remove from old shared user
            // 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) {
        if (result.mExistingSettingCopied) {
            pkgSetting = request.mPkgSetting;
            pkgSetting = request.mPkgSetting;
@@ -3455,14 +3461,12 @@ final class InstallPackageHelper {
    /**
    /**
     * Tries to restore the disabled system package after an update has been deleted.
     * Tries to restore the disabled system package after an update has been deleted.
     */
     */
    @GuardedBy({"mPm.mLock", "mPm.mInstallLock"})
    public void restoreDisabledSystemPackageLIF(DeletePackageAction action,
    public void restoreDisabledSystemPackageLIF(DeletePackageAction action,
            PackageSetting deletedPs, @NonNull int[] allUserHandles,
            @NonNull int[] allUserHandles, boolean writeSettings) throws SystemDeleteException {
            @Nullable PackageRemovedInfo outInfo,
        final PackageSetting deletedPs = action.mDeletingPs;
            boolean writeSettings,
        final PackageRemovedInfo outInfo = action.mRemovedInfo;
            PackageSetting disabledPs)
        final PackageSetting disabledPs = action.mDisabledPs;
            throws SystemDeleteException {

        // writer
        synchronized (mPm.mLock) {
        synchronized (mPm.mLock) {
            // NOTE: The system package always needs to be enabled; even if it's for
            // 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
            // a compressed stub. If we don't, installing the system package fails
@@ -3472,13 +3476,14 @@ final class InstallPackageHelper {
            mPm.mSettings.enableSystemPackageLPw(disabledPs.getPkg().getPackageName());
            mPm.mSettings.enableSystemPackageLPw(disabledPs.getPkg().getPackageName());
            // Remove any native libraries from the upgraded package.
            // Remove any native libraries from the upgraded package.
            removeNativeBinariesLI(deletedPs);
            removeNativeBinariesLI(deletedPs);
        }


            // Install the system package
            // Install the system package
            if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs);
            if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs);
            try {
            try {
                synchronized (mPm.mInstallLock) {
                    installPackageFromSystemLIF(disabledPs.getPathString(), allUserHandles,
                    installPackageFromSystemLIF(disabledPs.getPathString(), allUserHandles,
                            outInfo == null ? null : outInfo.mOrigUsers, writeSettings);
                            outInfo == null ? null : outInfo.mOrigUsers, writeSettings);
                }
            } catch (PackageManagerException e) {
            } catch (PackageManagerException e) {
                Slog.w(TAG, "Failed to restore system package:" + deletedPs.getPackageName() + ": "
                Slog.w(TAG, "Failed to restore system package:" + deletedPs.getPackageName() + ": "
                        + e.getMessage());
                        + e.getMessage());
@@ -3493,6 +3498,7 @@ final class InstallPackageHelper {
                }
                }
            }
            }
        }
        }
    }


    @GuardedBy("mPm.mLock")
    @GuardedBy("mPm.mLock")
    private void disableStubPackage(DeletePackageAction action, PackageSetting deletedPs,
    private void disableStubPackage(DeletePackageAction action, PackageSetting deletedPs,
+9 −4
Original line number Original line Diff line number Diff line
@@ -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())) {
        if (skipCheck || (s.packages.isEmpty() && s.mDisabledPackages.isEmpty())) {
            mSharedUsers.remove(s.name);
            if (mSharedUsers.remove(s.name) != null) {
                removeAppIdLPw(s.userId);
                removeAppIdLPw(s.userId);
                return true;
            }
        }
        }
        return false;
    }
    }


    int removePackageLPw(String name) {
    int removePackageLPw(String name) {
@@ -1267,7 +1270,9 @@ public final class Settings implements Watchable, Snappable {
            removeInstallerPackageStatus(name);
            removeInstallerPackageStatus(name);
            if (p.getSharedUser() != null) {
            if (p.getSharedUser() != null) {
                p.getSharedUser().removePackage(p);
                p.getSharedUser().removePackage(p);
                checkAndPruneSharedUserLPw(p.getSharedUser(), false);
                if (checkAndPruneSharedUserLPw(p.getSharedUser(), false)) {
                    return p.getSharedUser().userId;
                }
            } else {
            } else {
                removeAppIdLPw(p.getAppId());
                removeAppIdLPw(p.getAppId());
                return p.getAppId();
                return p.getAppId();