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

Commit 9758cdf5 authored by Songchun Fan's avatar Songchun Fan Committed by Android (Google) Code Review
Browse files

Merge "Revert "Consolidate installation logics from params/args classes""

parents 6ee11f4e 20855639
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -83,15 +83,19 @@ final class DeletePackageHelper {
    private final UserManagerInternal mUserManagerInternal;
    private final PermissionManagerServiceInternal mPermissionManager;
    private final RemovePackageHelper mRemovePackageHelper;
    // TODO(b/201815903): remove dependency to InitAndSystemPackageHelper
    private final InitAndSystemPackageHelper mInitAndSystemPackageHelper;
    private final AppDataHelper mAppDataHelper;

    // TODO(b/198166813): remove PMS dependency
    DeletePackageHelper(PackageManagerService pm, RemovePackageHelper removePackageHelper,
            InitAndSystemPackageHelper initAndSystemPackageHelper,
            AppDataHelper appDataHelper) {
        mPm = pm;
        mUserManagerInternal = mPm.mInjector.getUserManagerInternal();
        mPermissionManager = mPm.mInjector.getPermissionManagerServiceInternal();
        mRemovePackageHelper = removePackageHelper;
        mInitAndSystemPackageHelper = initAndSystemPackageHelper;
        mAppDataHelper = appDataHelper;
    }

@@ -101,6 +105,7 @@ final class DeletePackageHelper {
        mUserManagerInternal = mPm.mInjector.getUserManagerInternal();
        mPermissionManager = mPm.mInjector.getPermissionManagerServiceInternal();
        mRemovePackageHelper = new RemovePackageHelper(mPm, mAppDataHelper);
        mInitAndSystemPackageHelper = mPm.getInitAndSystemPackageHelper();
    }

    /**
@@ -277,7 +282,7 @@ final class DeletePackageHelper {
                            Slog.i(TAG, "Enabling system stub after removal; pkg: "
                                    + stubPkg.getPackageName());
                        }
                        new InstallPackageHelper(mPm).enableCompressedPackage(stubPkg, stubPs);
                        mInitAndSystemPackageHelper.enableCompressedPackage(stubPkg, stubPs);
                    } else if (DEBUG_COMPRESSION) {
                        Slog.i(TAG, "System stub disabled for all users, leaving uncompressed "
                                + "after removal; pkg: " + stubPkg.getPackageName());
@@ -417,7 +422,7 @@ final class DeletePackageHelper {
            // as well and fall back to existing code in system partition
            PackageSetting disabledPs = deleteInstalledSystemPackage(action, ps, allUserHandles,
                    flags, outInfo, writeSettings);
            new InstallPackageHelper(mPm).restoreDisabledSystemPackageLIF(
            mInitAndSystemPackageHelper.restoreDisabledSystemPackageLIF(
                    action, ps, allUserHandles, outInfo, writeSettings, disabledPs);
        } else {
            if (DEBUG_REMOVE) Slog.d(TAG, "Removing non-system package: " + ps.getPackageName());
+3 −1
Original line number Diff line number Diff line
@@ -41,12 +41,14 @@ public final class DomainVerificationConnection implements DomainVerificationSer
    final PackageManagerService mPm;
    final PackageManagerInternal mPmInternal;
    final UserManagerInternal mUmInternal;
    final VerificationHelper mVerificationHelper;

    // TODO(b/198166813): remove PMS dependency
    DomainVerificationConnection(PackageManagerService pm) {
        mPm = pm;
        mPmInternal = mPm.mInjector.getLocalService(PackageManagerInternal.class);
        mUmInternal = mPm.mInjector.getLocalService(UserManagerInternal.class);
        mVerificationHelper = new VerificationHelper(mPm.mContext);
    }

    @Override
@@ -77,7 +79,7 @@ public final class DomainVerificationConnection implements DomainVerificationSer

    @Override
    public long getPowerSaveTempWhitelistAppDuration() {
        return VerificationUtils.getVerificationTimeout(mPm.mContext);
        return mVerificationHelper.getVerificationTimeout();
    }

    @Override
+147 −4
Original line number Diff line number Diff line
@@ -16,13 +16,23 @@

package com.android.server.pm;

import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL;
import static com.android.server.pm.PackageManagerService.TAG;
import static android.content.pm.PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE;

import android.annotation.NonNull;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInfoLite;
import android.content.pm.PackageManager;
import android.os.UserHandle;
import android.util.Pair;
import android.util.Slog;

import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL;
import static com.android.server.pm.PackageManagerService.TAG;

import com.android.internal.util.ArrayUtils;
import com.android.server.pm.parsing.pkg.AndroidPackage;

abstract class HandlerParams {
    /** User handle for the user requesting the information or installation. */
    private final UserHandle mUser;
@@ -30,13 +40,15 @@ abstract class HandlerParams {
    int mTraceCookie;
    @NonNull
    final PackageManagerService mPm;
    final InstallPackageHelper mInstallPackageHelper;
    final VerificationHelper mVerificationHelper;
    final BroadcastHelper mBroadcastHelper;

    // TODO(b/198166813): remove PMS dependency
    HandlerParams(UserHandle user, PackageManagerService pm) {
        mUser = user;
        mPm = pm;
        mInstallPackageHelper = new InstallPackageHelper(mPm);
        mVerificationHelper = new VerificationHelper(mPm.mContext);
        mBroadcastHelper = new BroadcastHelper(mPm.mInjector);
    }

    UserHandle getUser() {
@@ -61,4 +73,135 @@ abstract class HandlerParams {

    abstract void handleStartCopy();
    abstract void handleReturnCode();

    Pair<Integer, String> verifyReplacingVersionCode(PackageInfoLite pkgLite,
            long requiredInstalledVersionCode, int installFlags) {
        if ((installFlags & PackageManager.INSTALL_APEX) != 0) {
            return verifyReplacingVersionCodeForApex(
                    pkgLite, requiredInstalledVersionCode, installFlags);
        }

        String packageName = pkgLite.packageName;
        synchronized (mPm.mLock) {
            // Package which currently owns the data that the new package will own if installed.
            // If an app is uninstalled while keeping data (e.g. adb uninstall -k), installedPkg
            // will be null whereas dataOwnerPkg will contain information about the package
            // which was uninstalled while keeping its data.
            AndroidPackage dataOwnerPkg = mPm.mPackages.get(packageName);
            if (dataOwnerPkg  == null) {
                PackageSetting ps = mPm.mSettings.getPackageLPr(packageName);
                if (ps != null) {
                    dataOwnerPkg = ps.getPkg();
                }
            }

            if (requiredInstalledVersionCode != PackageManager.VERSION_CODE_HIGHEST) {
                if (dataOwnerPkg == null) {
                    String errorMsg = "Required installed version code was "
                            + requiredInstalledVersionCode
                            + " but package is not installed";
                    Slog.w(TAG, errorMsg);
                    return Pair.create(
                            PackageManager.INSTALL_FAILED_WRONG_INSTALLED_VERSION, errorMsg);
                }

                if (dataOwnerPkg.getLongVersionCode() != requiredInstalledVersionCode) {
                    String errorMsg = "Required installed version code was "
                            + requiredInstalledVersionCode
                            + " but actual installed version is "
                            + dataOwnerPkg.getLongVersionCode();
                    Slog.w(TAG, errorMsg);
                    return Pair.create(
                            PackageManager.INSTALL_FAILED_WRONG_INSTALLED_VERSION, errorMsg);
                }
            }

            if (dataOwnerPkg != null) {
                if (!PackageManagerServiceUtils.isDowngradePermitted(installFlags,
                        dataOwnerPkg.isDebuggable())) {
                    try {
                        checkDowngrade(dataOwnerPkg, pkgLite);
                    } catch (PackageManagerException e) {
                        String errorMsg = "Downgrade detected: " + e.getMessage();
                        Slog.w(TAG, errorMsg);
                        return Pair.create(
                                PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE, errorMsg);
                    }
                }
            }
        }
        return Pair.create(PackageManager.INSTALL_SUCCEEDED, null);
    }

    private Pair<Integer, String> verifyReplacingVersionCodeForApex(PackageInfoLite pkgLite,
            long requiredInstalledVersionCode, int installFlags) {
        String packageName = pkgLite.packageName;

        final PackageInfo activePackage = mPm.mApexManager.getPackageInfo(packageName,
                ApexManager.MATCH_ACTIVE_PACKAGE);
        if (activePackage == null) {
            String errorMsg = "Attempting to install new APEX package " + packageName;
            Slog.w(TAG, errorMsg);
            return Pair.create(PackageManager.INSTALL_FAILED_PACKAGE_CHANGED, errorMsg);
        }

        final long activeVersion = activePackage.getLongVersionCode();
        if (requiredInstalledVersionCode != PackageManager.VERSION_CODE_HIGHEST
                && activeVersion != requiredInstalledVersionCode) {
            String errorMsg = "Installed version of APEX package " + packageName
                    + " does not match required. Active version: " + activeVersion
                    + " required: " + requiredInstalledVersionCode;
            Slog.w(TAG, errorMsg);
            return Pair.create(PackageManager.INSTALL_FAILED_WRONG_INSTALLED_VERSION, errorMsg);
        }

        final boolean isAppDebuggable = (activePackage.applicationInfo.flags
                & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
        final long newVersionCode = pkgLite.getLongVersionCode();
        if (!PackageManagerServiceUtils.isDowngradePermitted(installFlags, isAppDebuggable)
                && newVersionCode < activeVersion) {
            String errorMsg = "Downgrade of APEX package " + packageName
                    + " is not allowed. Active version: " + activeVersion
                    + " attempted: " + newVersionCode;
            Slog.w(TAG, errorMsg);
            return Pair.create(PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE, errorMsg);
        }

        return Pair.create(PackageManager.INSTALL_SUCCEEDED, null);
    }

    /**
     * Check and throw if the given before/after packages would be considered a
     * downgrade.
     */
    private static void checkDowngrade(AndroidPackage before, PackageInfoLite after)
            throws PackageManagerException {
        if (after.getLongVersionCode() < before.getLongVersionCode()) {
            throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE,
                    "Update version code " + after.versionCode + " is older than current "
                            + before.getLongVersionCode());
        } else if (after.getLongVersionCode() == before.getLongVersionCode()) {
            if (after.baseRevisionCode < before.getBaseRevisionCode()) {
                throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE,
                        "Update base revision code " + after.baseRevisionCode
                                + " is older than current " + before.getBaseRevisionCode());
            }

            if (!ArrayUtils.isEmpty(after.splitNames)) {
                for (int i = 0; i < after.splitNames.length; i++) {
                    final String splitName = after.splitNames[i];
                    final int j = ArrayUtils.indexOf(before.getSplitNames(), splitName);
                    if (j != -1) {
                        if (after.splitRevisionCodes[i] < before.getSplitRevisionCodes()[j]) {
                            throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE,
                                    "Update split " + splitName + " revision code "
                                            + after.splitRevisionCodes[i]
                                            + " is older than current "
                                            + before.getSplitRevisionCodes()[j]);
                        }
                    }
                }
            }
        }
    }
}
+425 −9

File changed.

Preview size limit exceeded, changes collapsed.

+2 −2699

File changed.

Preview size limit exceeded, changes collapsed.

Loading