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

Commit 0838eec5 authored by Songchun Fan's avatar Songchun Fan
Browse files

[pm] copy some fields from AndroidPackage to PackageState

These fields are valid even if the AndroidPackage object has been
deleted or does not exist. They are used in the app update flow. Using
the PackageState version of the fields allows updates for apps that
don't have a valid AndroidPackage object.

BUG: 300705469
Test: builds

Change-Id: I589b10fb2428057bbbbfcea1a3d976034e1ba2f3
parent c43bb7a0
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -1267,10 +1267,9 @@ final class InstallPackageHelper {
                    replace = true;
                    if (DEBUG_INSTALL) Slog.d(TAG, "Replace existing package: " + pkgName);
                }
                final AndroidPackage oldPackage = mPm.mPackages.get(pkgName);
                if (replace && oldPackage != null) {
                if (replace) {
                    // Prevent apps opting out from runtime permissions
                    final int oldTargetSdk = oldPackage.getTargetSdkVersion();
                    final int oldTargetSdk = ps.getTargetSdkVersion();
                    final int newTargetSdk = parsedPackage.getTargetSdkVersion();
                    if (oldTargetSdk > Build.VERSION_CODES.LOLLIPOP_MR1
                            && newTargetSdk <= Build.VERSION_CODES.LOLLIPOP_MR1) {
@@ -1282,10 +1281,10 @@ final class InstallPackageHelper {
                                        + " target SDK " + oldTargetSdk + " does.");
                    }
                    // Prevent persistent apps from being updated
                    if (oldPackage.isPersistent()
                    if (ps.isPersistent()
                            && ((installFlags & PackageManager.INSTALL_STAGED) == 0)) {
                        throw new PrepareFailure(PackageManager.INSTALL_FAILED_INVALID_APK,
                                "Package " + oldPackage.getPackageName() + " is a persistent app. "
                                "Package " + pkgName + " is a persistent app. "
                                        + "Persistent apps are not updateable.");
                    }
                }
@@ -1666,7 +1665,7 @@ final class InstallPackageHelper {
                    }

                    // don't allow a system upgrade unless the upgrade hash matches
                    if (oldPackage != null && oldPackage.getRestrictUpdateHash() != null
                    if (oldPackageState.getRestrictUpdateHash() != null
                            && oldPackageState.isSystem()) {
                        final byte[] digestBytes;
                        try {
@@ -1682,12 +1681,13 @@ final class InstallPackageHelper {
                            throw new PrepareFailure(INSTALL_FAILED_INVALID_APK,
                                    "Could not compute hash: " + pkgName11);
                        }
                        if (!Arrays.equals(oldPackage.getRestrictUpdateHash(), digestBytes)) {
                        if (!Arrays.equals(oldPackageState.getRestrictUpdateHash(), digestBytes)) {
                            throw new PrepareFailure(INSTALL_FAILED_INVALID_APK,
                                    "New package fails restrict-update check: " + pkgName11);
                        }
                        // retain upgrade restriction
                        parsedPackage.setRestrictUpdateHash(oldPackage.getRestrictUpdateHash());
                        parsedPackage.setRestrictUpdateHash(
                                oldPackageState.getRestrictUpdateHash());
                    }

                    if (oldPackage != null) {
+1 −2
Original line number Diff line number Diff line
@@ -1469,8 +1469,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
            archPkg.versionCodeMajor = (int) (longVersionCode >> 32);
            archPkg.versionCode = (int) longVersionCode;

            // TODO(b/297916136): extract target sdk version.
            archPkg.targetSdkVersion = MIN_INSTALLABLE_TARGET_SDK;
            archPkg.targetSdkVersion = ps.getTargetSdkVersion();

            // These get translated in flags important for user data management.
            archPkg.defaultToDeviceProtectedStorage = String.valueOf(
+44 −2

File changed.

Preview size limit exceeded, changes collapsed.

+4 −2
Original line number Diff line number Diff line
@@ -220,7 +220,8 @@ final class ScanPackageUtils {
                    UserManagerService.getInstance(), usesSdkLibraries,
                    parsedPackage.getUsesSdkLibrariesVersionsMajor(), usesStaticLibraries,
                    parsedPackage.getUsesStaticLibrariesVersions(), parsedPackage.getMimeGroups(),
                    newDomainSetId);
                    newDomainSetId, parsedPackage.isPersistent(),
                    parsedPackage.getTargetSdkVersion(), parsedPackage.getRestrictUpdateHash());
        } else {
            // make a deep copy to avoid modifying any existing system state.
            pkgSetting = new PackageSetting(pkgSetting);
@@ -240,7 +241,8 @@ final class ScanPackageUtils {
                    UserManagerService.getInstance(),
                    usesSdkLibraries, parsedPackage.getUsesSdkLibrariesVersionsMajor(),
                    usesStaticLibraries, parsedPackage.getUsesStaticLibrariesVersions(),
                    parsedPackage.getMimeGroups(), newDomainSetId);
                    parsedPackage.getMimeGroups(), newDomainSetId, parsedPackage.isPersistent(),
                    parsedPackage.getTargetSdkVersion(), parsedPackage.getRestrictUpdateHash());
        }

        if (createNewPackage && originalPkgSetting != null) {
+16 −5
Original line number Diff line number Diff line
@@ -1060,7 +1060,8 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
            boolean virtualPreload, boolean isStoppedSystemApp, UserManagerService userManager,
            String[] usesSdkLibraries, long[] usesSdkLibrariesVersions,
            String[] usesStaticLibraries, long[] usesStaticLibrariesVersions,
            Set<String> mimeGroupNames, @NonNull UUID domainSetId) {
            Set<String> mimeGroupNames, @NonNull UUID domainSetId, boolean isPersistent,
            int targetSdkVersion, byte[] restrictUpdatedHash) {
        final PackageSetting pkgSetting;
        if (originalPkg != null) {
            if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package "
@@ -1080,7 +1081,10 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
                    .setUsesStaticLibrariesVersions(usesStaticLibrariesVersions)
                    // Update new package state.
                    .setLastModifiedTime(codePath.lastModified())
                    .setDomainSetId(domainSetId);
                    .setDomainSetId(domainSetId)
                    .setIsPersistent(isPersistent)
                    .setTargetSdkVersion(targetSdkVersion)
                    .setRestrictUpdateHash(restrictUpdatedHash);
            pkgSetting.setFlags(pkgFlags)
                    .setPrivateFlags(pkgPrivateFlags);
        } else {
@@ -1092,7 +1096,10 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
                    null /*cpuAbiOverrideString*/, versionCode, pkgFlags, pkgPrivateFlags,
                    0 /*sharedUserAppId*/, usesSdkLibraries, usesSdkLibrariesVersions,
                    usesStaticLibraries, usesStaticLibrariesVersions,
                    createMimeGroups(mimeGroupNames), domainSetId);
                    createMimeGroups(mimeGroupNames), domainSetId)
                    .setIsPersistent(isPersistent)
                    .setTargetSdkVersion(targetSdkVersion)
                    .setRestrictUpdateHash(restrictUpdatedHash);
            pkgSetting.setLastModifiedTime(codePath.lastModified());
            if (sharedUser != null) {
                pkgSetting.setSharedUserAppId(sharedUser.mAppId);
@@ -1206,7 +1213,8 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
            int pkgPrivateFlags, @NonNull UserManagerService userManager,
            @Nullable String[] usesSdkLibraries, @Nullable long[] usesSdkLibrariesVersions,
            @Nullable String[] usesStaticLibraries, @Nullable long[] usesStaticLibrariesVersions,
            @Nullable Set<String> mimeGroupNames, @NonNull UUID domainSetId)
            @Nullable Set<String> mimeGroupNames, @NonNull UUID domainSetId, boolean isPersistent,
            int targetSdkVersion, byte[] restrictUpdatedHash)
                    throws PackageManagerException {
        final String pkgName = pkgSetting.getPackageName();
        if (sharedUser != null) {
@@ -1258,7 +1266,10 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
        pkgSetting.setPrimaryCpuAbi(primaryCpuAbi)
                .setSecondaryCpuAbi(secondaryCpuAbi)
                .updateMimeGroups(mimeGroupNames)
                .setDomainSetId(domainSetId);
                .setDomainSetId(domainSetId)
                .setIsPersistent(isPersistent)
                .setTargetSdkVersion(targetSdkVersion)
                .setRestrictUpdateHash(restrictUpdatedHash);
        // Update SDK library dependencies if needed.
        if (usesSdkLibraries != null && usesSdkLibrariesVersions != null
                && usesSdkLibraries.length == usesSdkLibrariesVersions.length) {
Loading