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

Commit 1c909915 authored by TYM Tsai's avatar TYM Tsai
Browse files

Make duplicate package installation as failed

Bug: 365075551
Flag: EXEMPT bug fix
Test: atest CtsPackageInstallTestCases
Test: atest CtsPackageManagerTestCases
Test: manual - sample app to create two installation for a apk.
     check the second seesion is failed with internal error(-40)
Change-Id: I83a72dd1c982ef41681956374213008baf2e578a
parent 67dc8e82
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -236,6 +236,10 @@ final class InstallPackageHelper {
    @GuardedBy("mInternalLock")
    private PowerManager.WakeLock mInstallingWakeLock;

    // List of packages being installed
    private final Set<String> mInstallingPackages;


    // TODO(b/198166813): remove PMS dependency
    InstallPackageHelper(PackageManagerService pm,
                         AppDataHelper appDataHelper,
@@ -255,6 +259,7 @@ final class InstallPackageHelper {
        mPackageAbiHelper = pm.mInjector.getAbiHelper();
        mSharedLibraries = pm.mInjector.getSharedLibrariesImpl();
        mUpdateOwnershipHelper = pm.mInjector.getUpdateOwnershipHelper();
        mInstallingPackages = new ArraySet<>();
    }

    /**
@@ -1317,6 +1322,19 @@ final class InstallPackageHelper {
                                    + " in multi-package install request.");
                    return false;
                }
                synchronized (mInstallingPackages) {
                    if (!mInstallingPackages.add(packageName)) {
                        request.setError("Scanning Failed.",
                                new PackageManagerException(
                                        PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE,
                                        "Duplicate package "
                                                + packageName
                                                + " in pending install requests.",
                                        PackageManagerException
                                                .INTERNAL_ERROR_DUPLICATE_INSTALLING_PACKAGE));
                        return false;
                    }
                }
                if (!checkNoAppStorageIsConsistent(
                        request.getScanRequestOldPackage(), packageToScan)) {
                    // TODO: INSTALL_FAILED_UPDATE_INCOMPATIBLE is about incomptabible
@@ -1410,6 +1428,20 @@ final class InstallPackageHelper {

    private void completeInstallProcess(List<InstallRequest> requests,
            Map<String, Boolean> createdAppId, boolean success) {
        synchronized (mInstallingPackages) {
            for (InstallRequest request : requests) {
                if (request.getInternalErrorCode()
                        == PackageManagerException.INTERNAL_ERROR_DUPLICATE_INSTALLING_PACKAGE) {
                    continue;
                }
                ParsedPackage parsedPkg = request.getParsedPackage();
                if (parsedPkg == null) {
                    // It will be null if the installation fails before parsing.
                    continue;
                }
                mInstallingPackages.remove(parsedPkg.getPackageName());
            }
        }
        if (success) {
            for (InstallRequest request : requests) {
                mInjector.getAppOpsManagerInternal().onPackageAdded(
+3 −1
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ public class PackageManagerException extends Exception {
    public static final int INTERNAL_ERROR_APEX_MORE_THAN_ONE_FILE = -37;
    public static final int INTERNAL_ERROR_MISSING_USER = -38;
    public static final int INTERNAL_ERROR_ARCHIVE_NO_INSTALLER_TITLE = -39;
    public static final int INTERNAL_ERROR_DUPLICATE_INSTALLING_PACKAGE = -40;

    @IntDef(prefix = { "INTERNAL_ERROR_" }, value = {
            INTERNAL_ERROR_NATIVE_LIBRARY_COPY,
@@ -105,7 +106,8 @@ public class PackageManagerException extends Exception {
            INTERNAL_ERROR_APEX_NOT_DIRECTORY,
            INTERNAL_ERROR_APEX_MORE_THAN_ONE_FILE,
            INTERNAL_ERROR_MISSING_USER,
            INTERNAL_ERROR_ARCHIVE_NO_INSTALLER_TITLE
            INTERNAL_ERROR_ARCHIVE_NO_INSTALLER_TITLE,
            INTERNAL_ERROR_DUPLICATE_INSTALLING_PACKAGE
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface InternalErrorCode {}