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

Commit 1563910d authored by Song Chun Fan's avatar Song Chun Fan Committed by Android (Google) Code Review
Browse files

Merge "[pm] make PackageRemovedInfo @NonNull during package deletion" into main

parents 9ee242bc eb7bb813
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -16,17 +16,19 @@

package com.android.server.pm;

import android.annotation.NonNull;
import android.os.UserHandle;

final class DeletePackageAction {
    public final PackageSetting mDeletingPs;
    public final PackageSetting mDisabledPs;
    @NonNull
    public final PackageRemovedInfo mRemovedInfo;
    public final int mFlags;
    public final UserHandle mUser;

    DeletePackageAction(PackageSetting deletingPs, PackageSetting disabledPs,
            PackageRemovedInfo removedInfo, int flags, UserHandle user) {
            @NonNull PackageRemovedInfo removedInfo, int flags, UserHandle user) {
        mDeletingPs = deletingPs;
        mDisabledPs = disabledPs;
        mRemovedInfo = removedInfo;
+29 −32
Original line number Diff line number Diff line
@@ -370,7 +370,7 @@ final class DeletePackageHelper {
    @GuardedBy("mPm.mInstallLock")
    public boolean deletePackageLIF(@NonNull String packageName, UserHandle user,
            boolean deleteCodeAndResources, @NonNull int[] allUserHandles, int flags,
            PackageRemovedInfo outInfo, boolean writeSettings) {
            @NonNull PackageRemovedInfo outInfo, boolean writeSettings) {
        final DeletePackageAction action;
        synchronized (mPm.mLock) {
            final PackageSetting ps = mPm.mSettings.getPackageLPr(packageName);
@@ -410,8 +410,8 @@ final class DeletePackageHelper {
     * deleted, {@code null} otherwise.
     */
    @Nullable
    public static DeletePackageAction mayDeletePackageLocked(
            PackageRemovedInfo outInfo, PackageSetting ps, @Nullable PackageSetting disabledPs,
    public static DeletePackageAction mayDeletePackageLocked(@NonNull PackageRemovedInfo outInfo,
            PackageSetting ps, @Nullable PackageSetting disabledPs,
            int flags, UserHandle user) {
        if (ps == null) {
            return null;
@@ -460,12 +460,18 @@ final class DeletePackageHelper {
        }

        final int userId = user == null ? UserHandle.USER_ALL : user.getIdentifier();
        if (outInfo != null) {
        // Remember which users are affected, before the installed states are modified
        outInfo.mRemovedUsers = (systemApp || userId == UserHandle.USER_ALL)
                ? ps.queryUsersInstalledOrHasData(allUserHandles)
                : new int[]{userId};
        }
        outInfo.populateBroadcastUsers(ps);
        outInfo.mDataRemoved = (flags & PackageManager.DELETE_KEEP_DATA) == 0;
        outInfo.mRemovedPackage = ps.getPackageName();
        outInfo.mInstallerPackageName = ps.getInstallSource().mInstallerPackageName;
        outInfo.mIsStaticSharedLib =
                ps.getPkg() != null && ps.getPkg().getStaticSharedLibraryName() != null;
        outInfo.mIsExternal = ps.isExternalStorage();
        outInfo.mRemovedPackageVersionCode = ps.getVersionCode();

        if ((!systemApp || (flags & PackageManager.DELETE_SYSTEM_APP) != 0)
                && userId != UserHandle.USER_ALL) {
@@ -503,7 +509,8 @@ final class DeletePackageHelper {
                }
            }
            if (clearPackageStateAndReturn) {
                mRemovePackageHelper.clearPackageStateForUserLIF(ps, userId, outInfo, flags);
                mRemovePackageHelper.clearPackageStateForUserLIF(ps, userId, flags);
                outInfo.mRemovedAppId = ps.getAppId();
                mPm.scheduleWritePackageRestrictions(user);
                return;
            }
@@ -529,12 +536,8 @@ final class DeletePackageHelper {

        // If the package removed had SUSPEND_APPS, unset any restrictions that might have been in
        // place for all affected users.
        int[] affectedUserIds = (outInfo != null) ? outInfo.mRemovedUsers : null;
        if (affectedUserIds == null) {
            affectedUserIds = mPm.resolveUserIds(userId);
        }
        final Computer snapshot = mPm.snapshotComputer();
        for (final int affectedUserId : affectedUserIds) {
        for (final int affectedUserId : outInfo.mRemovedUsers) {
            if (hadSuspendAppsPermission.get(affectedUserId)) {
                mPm.unsuspendForSuspendingPackage(snapshot, packageName, affectedUserId);
                mPm.removeAllDistractingPackageRestrictions(snapshot, affectedUserId);
@@ -542,32 +545,28 @@ final class DeletePackageHelper {
        }

        // Take a note whether we deleted the package for all users
        if (outInfo != null) {
        synchronized (mPm.mLock) {
            outInfo.mRemovedForAllUsers = mPm.mPackages.get(ps.getPackageName()) == null;
        }
    }
    }

    @GuardedBy("mPm.mInstallLock")
    private void deleteInstalledPackageLIF(PackageSetting ps,
            boolean deleteCodeAndResources, int flags, @NonNull int[] allUserHandles,
            PackageRemovedInfo outInfo, boolean writeSettings) {
            @NonNull PackageRemovedInfo outInfo, boolean writeSettings) {
        synchronized (mPm.mLock) {
            if (outInfo != null) {
            outInfo.mUid = ps.getAppId();
            outInfo.mBroadcastAllowList = mPm.mAppsFilter.getVisibilityAllowList(
                    mPm.snapshotComputer(), ps, allUserHandles,
                    mPm.mSettings.getPackagesLocked());
        }
        }

        // Delete package data from internal structures and also remove data if flag is set
        mRemovePackageHelper.removePackageDataLIF(
                ps, allUserHandles, outInfo, flags, writeSettings);

        // Delete application code and resources only for parent packages
        if (deleteCodeAndResources && (outInfo != null)) {
        if (deleteCodeAndResources) {
            outInfo.mArgs = new InstallArgs(
                    ps.getPathString(), getAppDexInstructionSets(
                            ps.getPrimaryCpuAbiLegacy(), ps.getSecondaryCpuAbiLegacy()));
@@ -639,7 +638,7 @@ final class DeletePackageHelper {
        int flags = action.mFlags;
        final PackageSetting deletedPs = action.mDeletingPs;
        final PackageRemovedInfo outInfo = action.mRemovedInfo;
        final boolean applyUserRestrictions = outInfo != null && (outInfo.mOrigUsers != null);
        final boolean applyUserRestrictions = outInfo.mOrigUsers != null;
        final AndroidPackage deletedPkg = deletedPs.getPkg();
        // Confirm if the system package has been updated
        // An updated system app can be deleted. This will also have to restore
@@ -662,10 +661,8 @@ final class DeletePackageHelper {
            }
        }

        if (outInfo != null) {
        // Delete the updated package
        outInfo.mIsRemovedPackageSystemUpdate = true;
        }

        if (disabledPs.getVersionCode() < deletedPs.getVersionCode()
                || disabledPs.getAppId() != deletedPs.getAppId()) {
+1 −1
Original line number Diff line number Diff line
@@ -4126,7 +4126,7 @@ final class InstallPackageHelper {
                        null /* request */)) {
                    mDeletePackageHelper.deletePackageLIF(
                            parsedPackage.getPackageName(), null, true,
                            mPm.mUserManager.getUserIds(), 0, null, false);
                            mPm.mUserManager.getUserIds(), 0, new PackageRemovedInfo(), false);
                }
            } else if (newPkgVersionGreater || newSharedUserSetting) {
                // The application on /system is newer than the application on /data.
+1 −0
Original line number Diff line number Diff line
@@ -3044,6 +3044,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
        }
    }

    @NonNull
    int[] resolveUserIds(int userId) {
        return (userId == UserHandle.USER_ALL) ? mUserManager.getUserIds() : new int[] { userId };
    }
+8 −35
Original line number Diff line number Diff line
@@ -252,8 +252,7 @@ final class RemovePackageHelper {
        }
    }

    public void clearPackageStateForUserLIF(PackageSetting ps, int userId,
            PackageRemovedInfo outInfo, int flags) {
    public void clearPackageStateForUserLIF(PackageSetting ps, int userId, int flags) {
        final AndroidPackage pkg;
        final SharedUserSetting sus;
        synchronized (mPm.mLock) {
@@ -287,25 +286,12 @@ final class RemovePackageHelper {
        }
        mPermissionManager.onPackageUninstalled(ps.getPackageName(), ps.getAppId(), ps, pkg,
                sharedUserPkgs, userId);

        if (outInfo != null) {
            if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) {
                outInfo.mDataRemoved = true;
            }
            outInfo.mRemovedPackage = ps.getPackageName();
            outInfo.mInstallerPackageName = ps.getInstallSource().mInstallerPackageName;
            outInfo.mIsStaticSharedLib = pkg != null && pkg.getStaticSharedLibraryName() != null;
            outInfo.mRemovedAppId = ps.getAppId();
            outInfo.mBroadcastUsers = outInfo.mRemovedUsers;
            outInfo.mIsExternal = ps.isExternalStorage();
            outInfo.mRemovedPackageVersionCode = ps.getVersionCode();
        }
    }

    // Called to clean up disabled system packages
    public void removePackageData(final PackageSetting deletedPs, @NonNull int[] allUserHandles) {
        synchronized (mPm.mInstallLock) {
            removePackageDataLIF(deletedPs, allUserHandles, /* outInfo= */ null,
            removePackageDataLIF(deletedPs, allUserHandles, new PackageRemovedInfo(),
                    /* flags= */ 0, /* writeSettings= */ false);
        }
    }
@@ -318,20 +304,11 @@ final class RemovePackageHelper {
     */
    @GuardedBy("mPm.mInstallLock")
    public void removePackageDataLIF(final PackageSetting deletedPs, @NonNull int[] allUserHandles,
            PackageRemovedInfo outInfo, int flags, boolean writeSettings) {
            @NonNull PackageRemovedInfo outInfo, int flags, boolean writeSettings) {
        String packageName = deletedPs.getPackageName();
        if (DEBUG_REMOVE) Slog.d(TAG, "removePackageDataLI: " + deletedPs);
        // Retrieve object to delete permissions for shared user later on
        final AndroidPackage deletedPkg = deletedPs.getPkg();
        if (outInfo != null) {
            outInfo.mRemovedPackage = packageName;
            outInfo.mInstallerPackageName = deletedPs.getInstallSource().mInstallerPackageName;
            outInfo.mIsStaticSharedLib = deletedPkg != null
                    && deletedPkg.getStaticSharedLibraryName() != null;
            outInfo.populateBroadcastUsers(deletedPs);
            outInfo.mIsExternal = deletedPs.isExternalStorage();
            outInfo.mRemovedPackageVersionCode = deletedPs.getVersionCode();
        }

        removePackageLI(deletedPs.getPackageName(), (flags & PackageManager.DELETE_CHATTY) != 0);
        if (!deletedPs.isSystem()) {
@@ -355,9 +332,6 @@ final class RemovePackageHelper {
            mAppDataHelper.destroyAppDataLIF(resolvedPkg, UserHandle.USER_ALL,
                    FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL);
            mAppDataHelper.destroyAppProfilesLIF(resolvedPkg.getPackageName());
            if (outInfo != null) {
                outInfo.mDataRemoved = true;
            }
        }

        int removedAppId = -1;
@@ -373,9 +347,8 @@ final class RemovePackageHelper {
                mPm.mAppsFilter.removePackage(snapshot,
                        snapshot.getPackageStateInternal(packageName));
                removedAppId = mPm.mSettings.removePackageLPw(packageName);
                if (outInfo != null) {
                outInfo.mRemovedAppId = removedAppId;
                }

                if (!mPm.mSettings.isDisabledSystemPackageLPr(packageName)) {
                    // If we don't have a disabled system package to reinstall, the package is
                    // really gone and its permission state should be removed.
@@ -403,8 +376,8 @@ final class RemovePackageHelper {
                    mBroadcastHelper.sendPreferredActivityChangedBroadcast(UserHandle.USER_ALL);
                });
            }
        } else if (!deletedPs.isSystem() && outInfo != null && !outInfo.mIsUpdate
                && outInfo.mRemovedUsers != null && !outInfo.mIsExternal) {
        } else if (!deletedPs.isSystem() && !outInfo.mIsUpdate
                && outInfo.mRemovedUsers != null && !deletedPs.isExternalStorage()) {
            // For non-system uninstalls with DELETE_KEEP_DATA, set the installed state to false
            // for affected users. This does not apply to app updates where the old apk is replaced
            // but the old data remains.
@@ -424,7 +397,7 @@ final class RemovePackageHelper {
        // make sure to preserve per-user installed state if this removal was just
        // a downgrade of a system app to the factory package
        boolean installedStateChanged = false;
        if (outInfo != null && outInfo.mOrigUsers != null && deletedPs.isSystem()) {
        if (outInfo.mOrigUsers != null && deletedPs.isSystem()) {
            if (DEBUG_REMOVE) {
                Slog.d(TAG, "Propagating install state across downgrade");
            }
Loading