summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java22
1 files changed, 22 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 22b4d5def8f4..5105fd384367 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -1399,7 +1399,29 @@ final class InstallPackageHelper {
"Package " + pkgName + " is a persistent app. "
+ "Persistent apps are not updateable.");
}
+ // When updating an sdk library, make sure that the versionMajor is
+ // changed if the targetSdkVersion and minSdkVersion have changed
+ if (parsedPackage.isSdkLibrary() && ps.getPkg() != null
+ && ps.getPkg().isSdkLibrary()) {
+ final int oldMinSdk = ps.getPkg().getMinSdkVersion();
+ final int newMinSdk = parsedPackage.getMinSdkVersion();
+ if (oldTargetSdk != newTargetSdk || oldMinSdk != newMinSdk) {
+ final int oldVersionMajor = ps.getPkg().getSdkLibVersionMajor();
+ final int newVersionMajor = parsedPackage.getSdkLibVersionMajor();
+ if (oldVersionMajor == newVersionMajor) {
+ throw new PrepareFailure(
+ PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE,
+ "Failure updating " + pkgName + " as it updates"
+ + " an sdk library <"
+ + parsedPackage.getSdkLibraryName() + ">"
+ + " without changing the versionMajor, but the"
+ + " targetSdkVersion or minSdkVersion has changed."
+ );
+ }
+ }
+ }
}
+
}
PackageSetting signatureCheckPs = ps;