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

Commit d74402bf authored by Songchun Fan's avatar Songchun Fan
Browse files

[pm] refactor to record affected users before installed state change

This is currently a no-op. The installed state change will be in the
next CL. This CL is a preparation for it.

BUG: 288142708
Test: atest
android.content.pm.cts.PackageManagerTest#testPackageRemovedBroadcastsSingleUser
Test: atest
android.content.pm.cts.PackageManagerShellCommandMultiUserTest#testPackageRemovedBroadcastsMultiUser

Change-Id: I84b2aadb2ce55caab26ff58e56ac828b8636e953
parent 86da59b4
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -435,6 +435,12 @@ 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.queryInstalledUsers(allUserHandles, /* installed= */true)
                    : new int[]{userId};
        }

        if ((!systemApp || (flags & PackageManager.DELETE_SYSTEM_APP) != 0)
                && userId != UserHandle.USER_ALL) {
@@ -630,7 +636,6 @@ final class DeletePackageHelper {
            // Preserve data by setting flag
            flags |= PackageManager.DELETE_KEEP_DATA;
        }

        synchronized (mPm.mInstallLock) {
            deleteInstalledPackageLIF(deletedPs, true, flags, allUserHandles, outInfo,
                    writeSettings);
+2 −2
Original line number Diff line number Diff line
@@ -3556,7 +3556,7 @@ final class InstallPackageHelper {
                logCriticalInfo(Log.WARN, "System package " + packageName
                        + " no longer exists; its data will be wiped");
                mInjector.getHandler().post(
                        () -> mRemovePackageHelper.removePackageData(ps, userIds, null, 0, false));
                        () -> mRemovePackageHelper.removePackageData(ps, userIds));
                expectingBetter.put(ps.getPackageName(), ps.getPath());
            } else {
                // we still have a disabled system package, but, it still might have
@@ -3631,7 +3631,7 @@ final class InstallPackageHelper {
            // partition], completely remove the package data.
            final PackageSetting ps = mPm.mSettings.getPackageLPr(packageName);
            if (ps != null && mPm.mPackages.get(packageName) == null) {
                mRemovePackageHelper.removePackageData(ps, userIds, null, 0, false);
                mRemovePackageHelper.removePackageData(ps, userIds);
            }
            logCriticalInfo(Log.WARN, msg);
        }
+3 −4
Original line number Diff line number Diff line
@@ -164,8 +164,7 @@ final class PackageRemovedInfo {
        }
    }

    public void populateUsers(int[] userIds, PackageSetting deletedPackageSetting) {
        mRemovedUsers = userIds;
    public void populateBroadcastUsers(PackageSetting deletedPackageSetting) {
        if (mRemovedUsers == null) {
            mBroadcastUsers = null;
            return;
@@ -173,8 +172,8 @@ final class PackageRemovedInfo {

        mBroadcastUsers = EMPTY_INT_ARRAY;
        mInstantUserIds = EMPTY_INT_ARRAY;
        for (int i = userIds.length - 1; i >= 0; --i) {
            final int userId = userIds[i];
        for (int i = mRemovedUsers.length - 1; i >= 0; --i) {
            final int userId = mRemovedUsers[i];
            if (deletedPackageSetting.getInstantApp(userId)) {
                mInstantUserIds = ArrayUtils.appendInt(mInstantUserIds, userId);
            } else {
+6 −8
Original line number Diff line number Diff line
@@ -295,25 +295,24 @@ final class RemovePackageHelper {
            outInfo.mInstallerPackageName = ps.getInstallSource().mInstallerPackageName;
            outInfo.mIsStaticSharedLib = pkg != null && pkg.getStaticSharedLibraryName() != null;
            outInfo.mRemovedAppId = ps.getAppId();
            outInfo.mRemovedUsers = userIds;
            outInfo.mBroadcastUsers = userIds;
            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,
            PackageRemovedInfo outInfo, int flags, boolean writeSettings) {
    public void removePackageData(final PackageSetting deletedPs, @NonNull int[] allUserHandles) {
        synchronized (mPm.mInstallLock) {
            removePackageDataLIF(deletedPs, allUserHandles, outInfo, flags, writeSettings);
            removePackageDataLIF(deletedPs, allUserHandles, /* outInfo= */ null,
                    /* flags= */ 0, /* writeSettings= */ false);
        }
    }

    /*
     * This method deletes the package from internal data structures. If the DELETE_KEEP_DATA
     * flag is not set, the data directory is removed as well.
     * make sure this flag is set for partially installed apps. If not its meaningless to
     * make sure this flag is set for partially installed apps. If not it's meaningless to
     * delete a partially installed application.
     */
    @GuardedBy("mPm.mInstallLock")
@@ -328,8 +327,7 @@ final class RemovePackageHelper {
            outInfo.mInstallerPackageName = deletedPs.getInstallSource().mInstallerPackageName;
            outInfo.mIsStaticSharedLib = deletedPkg != null
                    && deletedPkg.getStaticSharedLibraryName() != null;
            outInfo.populateUsers(deletedPs.queryInstalledUsers(
                    mUserManagerInternal.getUserIds(), true), deletedPs);
            outInfo.populateBroadcastUsers(deletedPs);
            outInfo.mIsExternal = deletedPs.isExternalStorage();
            outInfo.mRemovedPackageVersionCode = deletedPs.getVersionCode();
        }
+7 −5
Original line number Diff line number Diff line
@@ -125,7 +125,7 @@ public class PackageManagerServiceTest {
        Assert.assertNull(pri.mBroadcastUsers);

        // populateUsers with nothing leaves nothing
        pri.populateUsers(null, setting);
        pri.populateBroadcastUsers(setting);
        Assert.assertNull(pri.mBroadcastUsers);

        // Create a real (non-null) PackageSetting and confirm that the removed
@@ -139,9 +139,10 @@ public class PackageManagerServiceTest {
                .setSecondaryCpuAbiString("secondaryCpuAbiString")
                .setCpuAbiOverrideString("cpuAbiOverrideString")
                .build();
        pri.populateUsers(new int[]{
        pri.mRemovedUsers = new int[]{
                1, 2, 3, 4, 5
        }, setting);
        };
        pri.populateBroadcastUsers(setting);
        Assert.assertNotNull(pri.mBroadcastUsers);
        Assert.assertEquals(5, pri.mBroadcastUsers.length);
        Assert.assertNotNull(pri.mInstantUserIds);
@@ -151,9 +152,10 @@ public class PackageManagerServiceTest {
        pri.mBroadcastUsers = null;
        final int EXCLUDED_USER_ID = 4;
        setting.setInstantApp(true, EXCLUDED_USER_ID);
        pri.populateUsers(new int[]{
        pri.mRemovedUsers = new int[]{
                1, 2, 3, EXCLUDED_USER_ID, 5
        }, setting);
        };
        pri.populateBroadcastUsers(setting);
        Assert.assertNotNull(pri.mBroadcastUsers);
        Assert.assertEquals(4, pri.mBroadcastUsers.length);
        Assert.assertNotNull(pri.mInstantUserIds);