Loading core/java/android/content/pm/PackageInstaller.java +19 −0 Original line number Diff line number Diff line Loading @@ -1318,6 +1318,8 @@ public class PackageInstaller { public boolean isMultiPackage; /** {@hide} */ public boolean isStaged; /** {@hide} */ public long requiredInstalledVersionCode = PackageManager.VERSION_CODE_HIGHEST; /** * Construct parameters for a new package install session. Loading Loading @@ -1350,6 +1352,7 @@ public class PackageInstaller { installerPackageName = source.readString(); isMultiPackage = source.readBoolean(); isStaged = source.readBoolean(); requiredInstalledVersionCode = source.readLong(); } /** {@hide} */ Loading @@ -1372,6 +1375,7 @@ public class PackageInstaller { ret.installerPackageName = installerPackageName; ret.isMultiPackage = isMultiPackage; ret.isStaged = isStaged; ret.requiredInstalledVersionCode = requiredInstalledVersionCode; return ret; } Loading Loading @@ -1562,6 +1566,19 @@ public class PackageInstaller { } } /** * Require the given version of the package be installed. * The install will only be allowed if the existing version code of * the package installed on the device matches the given version code. * Use {@link * PackageManager#VERSION_CODE_HIGHEST} to allow * installation regardless of the currently installed package version. * * @hide */ public void setRequiredInstalledVersionCode(long versionCode) { requiredInstalledVersionCode = versionCode; } /** {@hide} */ public void setInstallFlagsForcePermissionPrompt() { installFlags |= PackageManager.INSTALL_FORCE_PERMISSION_PROMPT; Loading Loading @@ -1703,6 +1720,7 @@ public class PackageInstaller { pw.printPair("installerPackageName", installerPackageName); pw.printPair("isMultiPackage", isMultiPackage); pw.printPair("isStaged", isStaged); pw.printPair("requiredInstalledVersionCode", requiredInstalledVersionCode); pw.println(); } Loading Loading @@ -1731,6 +1749,7 @@ public class PackageInstaller { dest.writeString(installerPackageName); dest.writeBoolean(isMultiPackage); dest.writeBoolean(isStaged); dest.writeLong(requiredInstalledVersionCode); } public static final Parcelable.Creator<SessionParams> Loading core/java/android/content/pm/PackageManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -1423,6 +1423,14 @@ public abstract class PackageManager { */ public static final int INSTALL_FAILED_MULTIPACKAGE_INCONSISTENCY = -120; /** * Installation failed return code: the required installed version code * does not match the currently installed package version code. * * @hide */ public static final int INSTALL_FAILED_WRONG_INSTALLED_VERSION = -121; /** @hide */ @IntDef(flag = true, prefix = { "DELETE_" }, value = { DELETE_KEEP_DATA, Loading Loading @@ -6918,6 +6926,7 @@ public abstract class PackageManager { case INSTALL_FAILED_BAD_DEX_METADATA: return "INSTALL_FAILED_BAD_DEX_METADATA"; case INSTALL_FAILED_MISSING_SPLIT: return "INSTALL_FAILED_MISSING_SPLIT"; case INSTALL_FAILED_BAD_SIGNATURE: return "INSTALL_FAILED_BAD_SIGNATURE"; case INSTALL_FAILED_WRONG_INSTALLED_VERSION: return "INSTALL_FAILED_WRONG_INSTALLED_VERSION"; default: return Integer.toString(status); } } Loading core/java/com/android/internal/content/PackageHelper.java +2 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,8 @@ public class PackageHelper { public static final int RECOMMEND_MEDIA_UNAVAILABLE = -5; public static final int RECOMMEND_FAILED_INVALID_URI = -6; public static final int RECOMMEND_FAILED_VERSION_DOWNGRADE = -7; /** {@hide} */ public static final int RECOMMEND_FAILED_WRONG_INSTALLED_VERSION = -8; private static final String TAG = "PackageHelper"; // App installation location settings values Loading services/core/java/com/android/server/pm/PackageManagerService.java +26 −2 Original line number Diff line number Diff line Loading @@ -14996,12 +14996,14 @@ public class PackageManagerService extends IPackageManager.Stub final int installReason; @Nullable MultiPackageInstallParams mParentInstallParams; final long requiredInstalledVersionCode; InstallParams(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer, int installFlags, String installerPackageName, String volumeUuid, VerificationInfo verificationInfo, UserHandle user, String packageAbiOverride, String[] grantedPermissions, List<String> whitelistedRestrictedPermissions, PackageParser.SigningDetails signingDetails, int installReason) { PackageParser.SigningDetails signingDetails, int installReason, long requiredInstalledVersionCode) { super(user); this.origin = origin; this.move = move; Loading @@ -15015,6 +15017,7 @@ public class PackageManagerService extends IPackageManager.Stub this.whitelistedRestrictedPermissions = whitelistedRestrictedPermissions; this.signingDetails = signingDetails; this.installReason = installReason; this.requiredInstalledVersionCode = requiredInstalledVersionCode; } InstallParams(ActiveInstallSession activeInstallSession) { Loading Loading @@ -15045,6 +15048,8 @@ public class PackageManagerService extends IPackageManager.Stub whitelistedRestrictedPermissions = activeInstallSession.getSessionParams() .whitelistedRestrictedPermissions; signingDetails = activeInstallSession.getSigningDetails(); requiredInstalledVersionCode = activeInstallSession.getSessionParams() .requiredInstalledVersionCode; } @Override Loading Loading @@ -15073,6 +15078,23 @@ public class PackageManagerService extends IPackageManager.Stub } } if (requiredInstalledVersionCode != PackageManager.VERSION_CODE_HIGHEST) { if (dataOwnerPkg == null) { Slog.w(TAG, "Required installed version code was " + requiredInstalledVersionCode + " but package is not installed"); return PackageHelper.RECOMMEND_FAILED_WRONG_INSTALLED_VERSION; } if (dataOwnerPkg.getLongVersionCode() != requiredInstalledVersionCode) { Slog.w(TAG, "Required installed version code was " + requiredInstalledVersionCode + " but actual installed version is " + dataOwnerPkg.getLongVersionCode()); return PackageHelper.RECOMMEND_FAILED_WRONG_INSTALLED_VERSION; } } if (dataOwnerPkg != null) { if (!PackageManagerServiceUtils.isDowngradePermitted(installFlags, dataOwnerPkg.applicationInfo.flags)) { Loading Loading @@ -15199,6 +15221,8 @@ public class PackageManagerService extends IPackageManager.Stub loc = installLocationPolicy(pkgLite); if (loc == PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE) { ret = PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE; } else if (loc == PackageHelper.RECOMMEND_FAILED_WRONG_INSTALLED_VERSION) { ret = PackageManager.INSTALL_FAILED_WRONG_INSTALLED_VERSION; } else if (!onInt) { // Override install location with flags if (loc == PackageHelper.RECOMMEND_INSTALL_EXTERNAL) { Loading Loading @@ -23311,7 +23335,7 @@ public class PackageManagerService extends IPackageManager.Stub installerPackageName, volumeUuid, null /*verificationInfo*/, user, packageAbiOverride, null /*grantedPermissions*/, null /*whitelistedRestrictedPermissions*/, PackageParser.SigningDetails.UNKNOWN, PackageManager.INSTALL_REASON_UNKNOWN); PackageManager.INSTALL_REASON_UNKNOWN, PackageManager.VERSION_CODE_HIGHEST); params.setTraceMethod("movePackage").setTraceCookie(System.identityHashCode(params)); msg.obj = params; services/core/java/com/android/server/pm/StagingManager.java +16 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,22 @@ public class StagingManager { continue; } long activeVersion = activePackage.applicationInfo.longVersionCode; if (session.params.requiredInstalledVersionCode != PackageManager.VERSION_CODE_HIGHEST) { if (activeVersion != session.params.requiredInstalledVersionCode) { session.setStagedSessionFailed( SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, "Installed version of APEX package " + newPackage.packageName + " does not match required. Active version: " + activeVersion + " required: " + session.params.requiredInstalledVersionCode); if (!mApexManager.abortActiveSession()) { Slog.e(TAG, "Failed to abort apex session " + session.sessionId); } return false; } } boolean allowsDowngrade = PackageManagerServiceUtils.isDowngradePermitted( session.params.installFlags, activePackage.applicationInfo.flags); if (activeVersion > newPackage.versionCode && !allowsDowngrade) { Loading Loading
core/java/android/content/pm/PackageInstaller.java +19 −0 Original line number Diff line number Diff line Loading @@ -1318,6 +1318,8 @@ public class PackageInstaller { public boolean isMultiPackage; /** {@hide} */ public boolean isStaged; /** {@hide} */ public long requiredInstalledVersionCode = PackageManager.VERSION_CODE_HIGHEST; /** * Construct parameters for a new package install session. Loading Loading @@ -1350,6 +1352,7 @@ public class PackageInstaller { installerPackageName = source.readString(); isMultiPackage = source.readBoolean(); isStaged = source.readBoolean(); requiredInstalledVersionCode = source.readLong(); } /** {@hide} */ Loading @@ -1372,6 +1375,7 @@ public class PackageInstaller { ret.installerPackageName = installerPackageName; ret.isMultiPackage = isMultiPackage; ret.isStaged = isStaged; ret.requiredInstalledVersionCode = requiredInstalledVersionCode; return ret; } Loading Loading @@ -1562,6 +1566,19 @@ public class PackageInstaller { } } /** * Require the given version of the package be installed. * The install will only be allowed if the existing version code of * the package installed on the device matches the given version code. * Use {@link * PackageManager#VERSION_CODE_HIGHEST} to allow * installation regardless of the currently installed package version. * * @hide */ public void setRequiredInstalledVersionCode(long versionCode) { requiredInstalledVersionCode = versionCode; } /** {@hide} */ public void setInstallFlagsForcePermissionPrompt() { installFlags |= PackageManager.INSTALL_FORCE_PERMISSION_PROMPT; Loading Loading @@ -1703,6 +1720,7 @@ public class PackageInstaller { pw.printPair("installerPackageName", installerPackageName); pw.printPair("isMultiPackage", isMultiPackage); pw.printPair("isStaged", isStaged); pw.printPair("requiredInstalledVersionCode", requiredInstalledVersionCode); pw.println(); } Loading Loading @@ -1731,6 +1749,7 @@ public class PackageInstaller { dest.writeString(installerPackageName); dest.writeBoolean(isMultiPackage); dest.writeBoolean(isStaged); dest.writeLong(requiredInstalledVersionCode); } public static final Parcelable.Creator<SessionParams> Loading
core/java/android/content/pm/PackageManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -1423,6 +1423,14 @@ public abstract class PackageManager { */ public static final int INSTALL_FAILED_MULTIPACKAGE_INCONSISTENCY = -120; /** * Installation failed return code: the required installed version code * does not match the currently installed package version code. * * @hide */ public static final int INSTALL_FAILED_WRONG_INSTALLED_VERSION = -121; /** @hide */ @IntDef(flag = true, prefix = { "DELETE_" }, value = { DELETE_KEEP_DATA, Loading Loading @@ -6918,6 +6926,7 @@ public abstract class PackageManager { case INSTALL_FAILED_BAD_DEX_METADATA: return "INSTALL_FAILED_BAD_DEX_METADATA"; case INSTALL_FAILED_MISSING_SPLIT: return "INSTALL_FAILED_MISSING_SPLIT"; case INSTALL_FAILED_BAD_SIGNATURE: return "INSTALL_FAILED_BAD_SIGNATURE"; case INSTALL_FAILED_WRONG_INSTALLED_VERSION: return "INSTALL_FAILED_WRONG_INSTALLED_VERSION"; default: return Integer.toString(status); } } Loading
core/java/com/android/internal/content/PackageHelper.java +2 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,8 @@ public class PackageHelper { public static final int RECOMMEND_MEDIA_UNAVAILABLE = -5; public static final int RECOMMEND_FAILED_INVALID_URI = -6; public static final int RECOMMEND_FAILED_VERSION_DOWNGRADE = -7; /** {@hide} */ public static final int RECOMMEND_FAILED_WRONG_INSTALLED_VERSION = -8; private static final String TAG = "PackageHelper"; // App installation location settings values Loading
services/core/java/com/android/server/pm/PackageManagerService.java +26 −2 Original line number Diff line number Diff line Loading @@ -14996,12 +14996,14 @@ public class PackageManagerService extends IPackageManager.Stub final int installReason; @Nullable MultiPackageInstallParams mParentInstallParams; final long requiredInstalledVersionCode; InstallParams(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer, int installFlags, String installerPackageName, String volumeUuid, VerificationInfo verificationInfo, UserHandle user, String packageAbiOverride, String[] grantedPermissions, List<String> whitelistedRestrictedPermissions, PackageParser.SigningDetails signingDetails, int installReason) { PackageParser.SigningDetails signingDetails, int installReason, long requiredInstalledVersionCode) { super(user); this.origin = origin; this.move = move; Loading @@ -15015,6 +15017,7 @@ public class PackageManagerService extends IPackageManager.Stub this.whitelistedRestrictedPermissions = whitelistedRestrictedPermissions; this.signingDetails = signingDetails; this.installReason = installReason; this.requiredInstalledVersionCode = requiredInstalledVersionCode; } InstallParams(ActiveInstallSession activeInstallSession) { Loading Loading @@ -15045,6 +15048,8 @@ public class PackageManagerService extends IPackageManager.Stub whitelistedRestrictedPermissions = activeInstallSession.getSessionParams() .whitelistedRestrictedPermissions; signingDetails = activeInstallSession.getSigningDetails(); requiredInstalledVersionCode = activeInstallSession.getSessionParams() .requiredInstalledVersionCode; } @Override Loading Loading @@ -15073,6 +15078,23 @@ public class PackageManagerService extends IPackageManager.Stub } } if (requiredInstalledVersionCode != PackageManager.VERSION_CODE_HIGHEST) { if (dataOwnerPkg == null) { Slog.w(TAG, "Required installed version code was " + requiredInstalledVersionCode + " but package is not installed"); return PackageHelper.RECOMMEND_FAILED_WRONG_INSTALLED_VERSION; } if (dataOwnerPkg.getLongVersionCode() != requiredInstalledVersionCode) { Slog.w(TAG, "Required installed version code was " + requiredInstalledVersionCode + " but actual installed version is " + dataOwnerPkg.getLongVersionCode()); return PackageHelper.RECOMMEND_FAILED_WRONG_INSTALLED_VERSION; } } if (dataOwnerPkg != null) { if (!PackageManagerServiceUtils.isDowngradePermitted(installFlags, dataOwnerPkg.applicationInfo.flags)) { Loading Loading @@ -15199,6 +15221,8 @@ public class PackageManagerService extends IPackageManager.Stub loc = installLocationPolicy(pkgLite); if (loc == PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE) { ret = PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE; } else if (loc == PackageHelper.RECOMMEND_FAILED_WRONG_INSTALLED_VERSION) { ret = PackageManager.INSTALL_FAILED_WRONG_INSTALLED_VERSION; } else if (!onInt) { // Override install location with flags if (loc == PackageHelper.RECOMMEND_INSTALL_EXTERNAL) { Loading Loading @@ -23311,7 +23335,7 @@ public class PackageManagerService extends IPackageManager.Stub installerPackageName, volumeUuid, null /*verificationInfo*/, user, packageAbiOverride, null /*grantedPermissions*/, null /*whitelistedRestrictedPermissions*/, PackageParser.SigningDetails.UNKNOWN, PackageManager.INSTALL_REASON_UNKNOWN); PackageManager.INSTALL_REASON_UNKNOWN, PackageManager.VERSION_CODE_HIGHEST); params.setTraceMethod("movePackage").setTraceCookie(System.identityHashCode(params)); msg.obj = params;
services/core/java/com/android/server/pm/StagingManager.java +16 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,22 @@ public class StagingManager { continue; } long activeVersion = activePackage.applicationInfo.longVersionCode; if (session.params.requiredInstalledVersionCode != PackageManager.VERSION_CODE_HIGHEST) { if (activeVersion != session.params.requiredInstalledVersionCode) { session.setStagedSessionFailed( SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, "Installed version of APEX package " + newPackage.packageName + " does not match required. Active version: " + activeVersion + " required: " + session.params.requiredInstalledVersionCode); if (!mApexManager.abortActiveSession()) { Slog.e(TAG, "Failed to abort apex session " + session.sessionId); } return false; } } boolean allowsDowngrade = PackageManagerServiceUtils.isDowngradePermitted( session.params.installFlags, activePackage.applicationInfo.flags); if (activeVersion > newPackage.versionCode && !allowsDowngrade) { Loading