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

Commit cf70e8f1 authored by Mohammad Samiul Islam's avatar Mohammad Samiul Islam
Browse files

Simplify handleStartCopy method so that it is easier to understand

- We only enable rollback when INSTALL_ENABLE_ROLLBACK is set, which is
never true when we are moving package.
- installLocationPolicy doesn't return RECOMMEND_INSTALL_EPHEMERAL, so
we can skip setting INSTALL_INSTANT_APP flag on installFlags.

Bug: 136257624
Test: atest GtsSecurityHostTestCases
Test: atest CtsAtomicInstallTestCases
Change-Id: I7c64fd19b1824694d30e00e8fb573cf50077dec3
parent fa8bbc67
Loading
Loading
Loading
Loading
+61 −76
Original line number Diff line number Diff line
@@ -14812,35 +14812,27 @@ public class PackageManagerService extends IPackageManager.Stub
         * on the install location.
         */
        public void handleStartCopy() {
            int ret = PackageManager.INSTALL_SUCCEEDED;
            PackageInfoLite pkgLite = PackageManagerServiceUtils.getMinimalPackageInfo(mContext,
                    origin.resolvedPath, installFlags, packageAbiOverride);
            final boolean ephemeral = (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
            if (DEBUG_INSTANT && ephemeral) {
                Slog.v(TAG, "pkgLite for install: " + pkgLite);
            }
            // If we're already staged, we've firmly committed to an install location
            if (origin.staged) {
                // If we're already staged, we've firmly committed to an install location
                if (origin.file != null) {
                    installFlags |= PackageManager.INSTALL_INTERNAL;
                } else {
                    throw new IllegalStateException("Invalid stage location");
                }
            }
            final boolean onInt = (installFlags & PackageManager.INSTALL_INTERNAL) != 0;
            final boolean ephemeral = (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
            PackageInfoLite pkgLite = null;
            pkgLite = PackageManagerServiceUtils.getMinimalPackageInfo(mContext,
                    origin.resolvedPath, installFlags, packageAbiOverride);
            if (DEBUG_INSTANT && ephemeral) {
                Slog.v(TAG, "pkgLite for install: " + pkgLite);
            }
            } else if (pkgLite.recommendedInstallLocation
                    == PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE) {
                /*
             * If we have too little free space, try to free cache
                 * If we are not staged and have too little free space, try to free cache
                 * before giving up.
                 */
            if (!origin.staged && pkgLite.recommendedInstallLocation
                    == PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE) {
                // TODO: focus freeing disk space on the target device
                final StorageManager storage = StorageManager.from(mContext);
                final long lowThreshold = storage.getStorageLowBytes(
@@ -14870,8 +14862,7 @@ public class PackageManagerService extends IPackageManager.Stub
                }
            }
            if (ret == PackageManager.INSTALL_SUCCEEDED) {
            int ret = PackageManager.INSTALL_SUCCEEDED;
            int loc = pkgLite.recommendedInstallLocation;
            if (loc == PackageHelper.RECOMMEND_FAILED_INVALID_LOCATION) {
                ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
@@ -14888,6 +14879,9 @@ public class PackageManagerService extends IPackageManager.Stub
            } else {
                // Override with defaults if needed.
                loc = installLocationPolicy(pkgLite);
                final boolean onInt = (installFlags & PackageManager.INSTALL_INTERNAL) != 0;
                if (loc == PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE) {
                    ret = PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE;
                } else if (loc == PackageHelper.RECOMMEND_FAILED_WRONG_INSTALLED_VERSION) {
@@ -14897,12 +14891,6 @@ public class PackageManagerService extends IPackageManager.Stub
                    if (loc == PackageHelper.RECOMMEND_INSTALL_EXTERNAL) {
                        // Set the flag to install on external media.
                        installFlags &= ~PackageManager.INSTALL_INTERNAL;
                        } else if (loc == PackageHelper.RECOMMEND_INSTALL_EPHEMERAL) {
                            if (DEBUG_INSTANT) {
                                Slog.v(TAG, "...setting INSTALL_EPHEMERAL install flag");
                            }
                            installFlags |= PackageManager.INSTALL_INSTANT_APP;
                            installFlags &= ~PackageManager.INSTALL_INTERNAL;
                    } else {
                        // Make sure the flag for installing on external
                        // media is unset
@@ -14910,19 +14898,19 @@ public class PackageManagerService extends IPackageManager.Stub
                    }
                }
            }
            }
            final InstallArgs args = createInstallArgs(this);
            mVerificationCompleted = true;
            mIntegrityVerificationCompleted = true;
            mEnableRollbackCompleted = true;
            mArgs = args;
            if (ret == PackageManager.INSTALL_SUCCEEDED) {
            // Now that installFlags is finalized, we can create an immutable InstallArgs
            mArgs = createInstallArgs(this);
            // Perform package verification and enable rollback (unless we are simply moving the
            // package).
            if (ret == PackageManager.INSTALL_SUCCEEDED && !origin.existing) {
                final int verificationId = mPendingVerificationToken++;
                // Perform package verification (unless we are simply moving the package).
                if (!origin.existing) {
                PackageVerificationState verificationState =
                        new PackageVerificationState(this);
                mPendingVerification.append(verificationId, verificationState);
@@ -14935,11 +14923,8 @@ public class PackageManagerService extends IPackageManager.Stub
                if (verificationState.areAllVerificationsComplete()) {
                    mPendingVerification.remove(verificationId);
                }
                }
                if ((installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0) {
                    // TODO(ruhler) b/112431924: Don't do this in case of 'move'?
                    final int enableRollbackToken = mPendingEnableRollbackToken++;
                    Trace.asyncTraceBegin(
                            TRACE_TAG_PACKAGE_MANAGER, "enable_rollback", enableRollbackToken);