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

Commit 286ace3f authored by Songchun Fan's avatar Songchun Fan
Browse files

[pm] move more broadcast related code to BroadcastHelper

Just refactoring, as a preparation to remove PackageSender later.

BUG: 300314921
Test: atest com.android.server.pm.ApexManagerTest
Test: atest com.android.server.pm.DistractingPackageHelperTest
Test: atest com.android.server.pm.SuspendPackageHelperTest
Test: atest com.android.server.pm.PackageMonitorCallbackHelperTest
Test: atest com.android.server.pm.PackageManagerServiceTest

Change-Id: I8f95be1a3df6d262bd0fcc1232f4d4d540a5b049
parent 69758018
Loading
Loading
Loading
Loading
+675 −39

File changed.

Preview size limit exceeded, changes collapsed.

+10 −14
Original line number Diff line number Diff line
@@ -62,7 +62,6 @@ import android.util.SparseBooleanArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.ArchiveState;
import com.android.server.pm.pkg.PackageStateInternal;
@@ -86,19 +85,16 @@ final class DeletePackageHelper {

    private final PackageManagerService mPm;
    private final UserManagerInternal mUserManagerInternal;
    private final PermissionManagerServiceInternal mPermissionManager;
    private final RemovePackageHelper mRemovePackageHelper;
    private final BroadcastHelper mBroadcastHelper;

    // TODO(b/198166813): remove PMS dependency
    DeletePackageHelper(PackageManagerService pm, RemovePackageHelper removePackageHelper) {
    DeletePackageHelper(PackageManagerService pm, RemovePackageHelper removePackageHelper,
                        BroadcastHelper broadcastHelper) {
        mPm = pm;
        mUserManagerInternal = mPm.mInjector.getUserManagerInternal();
        mPermissionManager = mPm.mInjector.getPermissionManagerServiceInternal();
        mRemovePackageHelper = removePackageHelper;
    }

    DeletePackageHelper(PackageManagerService pm) {
        this(pm, new RemovePackageHelper(pm));
        mBroadcastHelper = broadcastHelper;
    }

    /**
@@ -120,7 +116,7 @@ final class DeletePackageHelper {
     */
    public int deletePackageX(String packageName, long versionCode, int userId, int deleteFlags,
            boolean removedBySystem) {
        final PackageRemovedInfo info = new PackageRemovedInfo(mPm);
        final PackageRemovedInfo info = new PackageRemovedInfo();
        final boolean res;

        final int removeUser = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0
@@ -250,8 +246,9 @@ final class DeletePackageHelper {
        if (res) {
            final boolean killApp = (deleteFlags & PackageManager.DELETE_DONT_KILL_APP) == 0;
            final boolean isArchived = (deleteFlags & PackageManager.DELETE_ARCHIVE) != 0;
            info.sendPackageRemovedBroadcasts(killApp, removedBySystem, isArchived);
            info.sendSystemPackageUpdatedBroadcasts();
            mBroadcastHelper.sendPackageRemovedBroadcasts(info, mPm, killApp,
                    removedBySystem, isArchived);
            mBroadcastHelper.sendSystemPackageUpdatedBroadcasts(info);
            PackageMetrics.onUninstallSucceeded(info, deleteFlags, removeUser);
        }

@@ -313,7 +310,7 @@ final class DeletePackageHelper {
                            Slog.i(TAG, "Enabling system stub after removal; pkg: "
                                    + stubPkg.getPackageName());
                        }
                        new InstallPackageHelper(mPm).enableCompressedPackage(stubPkg, stubPs);
                        mPm.enableCompressedPackage(stubPkg, stubPs);
                    } else if (DEBUG_COMPRESSION) {
                        Slog.i(TAG, "System stub disabled for all users, leaving uncompressed "
                                + "after removal; pkg: " + stubPkg.getPackageName());
@@ -490,8 +487,7 @@ final class DeletePackageHelper {
            // When an updated system application is deleted we delete the existing resources
            // as well and fall back to existing code in system partition
            deleteInstalledSystemPackage(action, allUserHandles, writeSettings);
            new InstallPackageHelper(mPm).restoreDisabledSystemPackageLIF(
                    action, allUserHandles, writeSettings);
            mPm.restoreDisabledSystemPackageLIF(action, allUserHandles, writeSettings);
        } else {
            if (DEBUG_REMOVE) Slog.d(TAG, "Removing non-system package: " + ps.getPackageName());
            if (ps.isIncremental()) {
+7 −36
Original line number Diff line number Diff line
@@ -19,10 +19,7 @@ package com.android.server.pm;
import static android.content.pm.PackageManager.RESTRICTION_NONE;

import android.annotation.NonNull;
import android.content.Intent;
import android.content.pm.PackageManager.DistractionRestriction;
import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;
import android.util.ArraySet;
import android.util.IntArray;
@@ -42,17 +39,16 @@ public final class DistractingPackageHelper {

    // TODO(b/198166813): remove PMS dependency
    private final PackageManagerService mPm;
    private final PackageManagerServiceInjector mInjector;
    private final BroadcastHelper mBroadcastHelper;
    private final SuspendPackageHelper mSuspendPackageHelper;

    /**
     * Constructor for {@link PackageManagerService}.
     */
    DistractingPackageHelper(PackageManagerService pm, PackageManagerServiceInjector injector,
            BroadcastHelper broadcastHelper, SuspendPackageHelper suspendPackageHelper) {
    DistractingPackageHelper(PackageManagerService pm,
                             BroadcastHelper broadcastHelper,
                             SuspendPackageHelper suspendPackageHelper) {
        mPm = pm;
        mInjector = injector;
        mBroadcastHelper = broadcastHelper;
        mSuspendPackageHelper = suspendPackageHelper;
    }
@@ -127,8 +123,8 @@ public final class DistractingPackageHelper {
        if (!changedPackagesList.isEmpty()) {
            final String[] changedPackages = changedPackagesList.toArray(
                    new String[changedPackagesList.size()]);
            sendDistractingPackagesChanged(changedPackages, changedUids.toArray(), userId,
                    restrictionFlags);
            mBroadcastHelper.sendDistractingPackagesChanged(mPm.snapshotComputer(),
                    changedPackages, changedUids.toArray(), userId, restrictionFlags);
            mPm.scheduleWritePackageRestrictions(userId);
        }
        return unactionedPackages.toArray(new String[0]);
@@ -202,34 +198,9 @@ public final class DistractingPackageHelper {
        if (!changedPackages.isEmpty()) {
            final String[] packageArray = changedPackages.toArray(
                    new String[changedPackages.size()]);
            sendDistractingPackagesChanged(packageArray, changedUids.toArray(), userId,
                    RESTRICTION_NONE);
            mBroadcastHelper.sendDistractingPackagesChanged(mPm.snapshotComputer(),
                    packageArray, changedUids.toArray(), userId, RESTRICTION_NONE);
            mPm.scheduleWritePackageRestrictions(userId);
        }
    }

    /**
     * Send broadcast intents for packages distracting changes.
     *
     * @param pkgList The names of packages which have suspension changes.
     * @param uidList The uids of packages which have suspension changes.
     * @param userId The user where packages reside.
     */
    void sendDistractingPackagesChanged(@NonNull String[] pkgList, int[] uidList, int userId,
            int distractionFlags) {
        final Bundle extras = new Bundle();
        extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST, pkgList);
        extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, uidList);
        extras.putInt(Intent.EXTRA_DISTRACTION_RESTRICTIONS, distractionFlags);

        final Handler handler = mInjector.getHandler();
        handler.post(() -> mBroadcastHelper.sendPackageBroadcast(
                Intent.ACTION_DISTRACTING_PACKAGES_CHANGED, null /* pkg */,
                extras, Intent.FLAG_RECEIVER_REGISTERED_ONLY, null /* targetPkg */,
                null /* finishedReceiver */, new int[]{userId}, null /* instantUserIds */,
                null /* broadcastAllowList */,
                (callingUid, intentExtras) -> BroadcastHelper.filterExtrasChangedPackageList(
                        mPm.snapshotComputer(), callingUid, intentExtras),
                null /* bOptions */));
    }
}
+33 −230

File changed.

Preview size limit exceeded, changes collapsed.

+8 −14
Original line number Diff line number Diff line
@@ -94,8 +94,6 @@ class InstallingSession {
    private final UserHandle mUser;
    @NonNull
    final PackageManagerService mPm;
    final InstallPackageHelper mInstallPackageHelper;
    final RemovePackageHelper mRemovePackageHelper;
    final boolean mIsInherit;
    final int mSessionId;
    final int mRequireUserAction;
@@ -108,8 +106,6 @@ class InstallingSession {
            PackageLite packageLite, PackageManagerService pm) {
        mPm = pm;
        mUser = user;
        mInstallPackageHelper = new InstallPackageHelper(mPm);
        mRemovePackageHelper = new RemovePackageHelper(mPm);
        mOriginInfo = originInfo;
        mMoveInfo = moveInfo;
        mObserver = observer;
@@ -142,8 +138,6 @@ class InstallingSession {
            PackageLite packageLite, PackageManagerService pm) {
        mPm = pm;
        mUser = user;
        mInstallPackageHelper = new InstallPackageHelper(mPm);
        mRemovePackageHelper = new RemovePackageHelper(mPm);
        mOriginInfo = OriginInfo.fromStagedFile(stagedDir);
        mMoveInfo = null;
        mInstallReason = fixUpInstallReason(
@@ -242,7 +236,7 @@ class InstallingSession {
        // state can change within this delay and hence we need to re-verify certain conditions.
        boolean isStaged = (mInstallFlags & INSTALL_STAGED) != 0;
        if (isStaged) {
            Pair<Integer, String> ret = mInstallPackageHelper.verifyReplacingVersionCode(
            Pair<Integer, String> ret = mPm.verifyReplacingVersionCode(
                    pkgLite, mRequiredInstalledVersionCode, mInstallFlags);
            mRet = ret.first;
            if (mRet != INSTALL_SUCCEEDED) {
@@ -540,39 +534,39 @@ class InstallingSession {
                }
            }
        } else {
            mInstallPackageHelper.installPackagesTraced(installRequests);
            mPm.installPackagesTraced(installRequests);

            for (InstallRequest request : installRequests) {
                doPostInstall(request);
            }
        }
        for (InstallRequest request : installRequests) {
            mInstallPackageHelper.restoreAndPostInstall(request);
            mPm.restoreAndPostInstall(request);
        }
    }

    private void doPostInstall(InstallRequest request) {
        if (mMoveInfo != null) {
            if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
                mRemovePackageHelper.cleanUpForMoveInstall(mMoveInfo.mFromUuid,
                mPm.cleanUpForMoveInstall(mMoveInfo.mFromUuid,
                        mMoveInfo.mPackageName, mMoveInfo.mFromCodePath);
            } else {
                mRemovePackageHelper.cleanUpForMoveInstall(mMoveInfo.mToUuid,
                mPm.cleanUpForMoveInstall(mMoveInfo.mToUuid,
                        mMoveInfo.mPackageName, mMoveInfo.mFromCodePath);
            }
        } else {
            if (request.getReturnCode() != PackageManager.INSTALL_SUCCEEDED) {
                mRemovePackageHelper.removeCodePath(request.getCodeFile());
                mPm.removeCodePath(request.getCodeFile());
            }
        }
    }

    private void cleanUpForFailedInstall(InstallRequest request) {
        if (request.isInstallMove()) {
            mRemovePackageHelper.cleanUpForMoveInstall(request.getMoveToUuid(),
            mPm.cleanUpForMoveInstall(request.getMoveToUuid(),
                    request.getMovePackageName(), request.getMoveFromCodePath());
        } else {
            mRemovePackageHelper.removeCodePath(request.getCodeFile());
            mPm.removeCodePath(request.getCodeFile());
        }
    }

Loading