Installation fail for mismatched certificates.
Bug: 213398637
Fixes: 213398637
Test: atest PackageManagerShellCommandTest
Change-Id: Iab480157163627af2a2e9c49439460b2f58810c2
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index d002c26..0d65463 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -1207,17 +1207,33 @@
}
PackageSetting ps = mPm.mSettings.getPackageLPr(pkgName);
- if (ps != null) {
- if (DEBUG_INSTALL) Slog.d(TAG, "Existing package: " + ps);
+ PackageSetting signatureCheckPs = ps;
+
+ // SDK libs can have other major versions with different package names.
+ if (signatureCheckPs == null && parsedPackage.isSdkLibrary()) {
+ WatchedLongSparseArray<SharedLibraryInfo> libraryInfos =
+ mSharedLibraries.getSharedLibraryInfos(
+ parsedPackage.getSdkLibName());
+ if (libraryInfos != null && libraryInfos.size() > 0) {
+ // Any existing version would do.
+ SharedLibraryInfo libraryInfo = libraryInfos.valueAt(0);
+ signatureCheckPs = mPm.mSettings.getPackageLPr(libraryInfo.getPackageName());
+ }
+ }
+
+ if (signatureCheckPs != null) {
+ if (DEBUG_INSTALL) {
+ Slog.d(TAG,
+ "Existing package for signature checking: " + signatureCheckPs);
+ }
// Static shared libs have same package with different versions where
// we internally use a synthetic package name to allow multiple versions
// of the same package, therefore we need to compare signatures against
// the package setting for the latest library version.
- PackageSetting signatureCheckPs = ps;
if (parsedPackage.isStaticSharedLibrary()) {
- SharedLibraryInfo libraryInfo = mSharedLibraries.getLatestSharedLibraVersionLPr(
- parsedPackage);
+ SharedLibraryInfo libraryInfo =
+ mSharedLibraries.getLatestStaticSharedLibraVersionLPr(parsedPackage);
if (libraryInfo != null) {
signatureCheckPs = mPm.mSettings.getPackageLPr(
libraryInfo.getPackageName());
@@ -1256,6 +1272,10 @@
throw new PrepareFailure(e.error, e.getMessage());
}
}
+ }
+
+ if (ps != null) {
+ if (DEBUG_INSTALL) Slog.d(TAG, "Existing package: " + ps);
if (ps.getPkg() != null) {
systemApp = ps.getPkg().isSystem();
diff --git a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
index aa23050..2227a78 100644
--- a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
+++ b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
@@ -384,7 +384,7 @@
* @return The latest version of shared library info.
*/
@GuardedBy("mPm.mLock")
- @Nullable SharedLibraryInfo getLatestSharedLibraVersionLPr(@NonNull AndroidPackage pkg) {
+ @Nullable SharedLibraryInfo getLatestStaticSharedLibraVersionLPr(@NonNull AndroidPackage pkg) {
WatchedLongSparseArray<SharedLibraryInfo> versionedLib = mSharedLibraries.get(
pkg.getStaticSharedLibName());
if (versionedLib == null) {
@@ -416,7 +416,7 @@
PackageSetting sharedLibPackage = null;
synchronized (mPm.mLock) {
final SharedLibraryInfo latestSharedLibraVersionLPr =
- getLatestSharedLibraVersionLPr(scanResult.mRequest.mParsedPackage);
+ getLatestStaticSharedLibraVersionLPr(scanResult.mRequest.mParsedPackage);
if (latestSharedLibraVersionLPr != null) {
sharedLibPackage = mPm.mSettings.getPackageLPr(
latestSharedLibraVersionLPr.getPackageName());
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
index 6de12cb9..2735e3d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
@@ -196,7 +196,8 @@
val newLibSetting = addPackage(STATIC_LIB_PACKAGE_NAME + "_" + 10, 10L,
staticLibrary = STATIC_LIB_NAME, staticLibraryVersion = 10L)
- val latestInfo = mSharedLibrariesImpl.getLatestSharedLibraVersionLPr(newLibSetting.pkg)!!
+ val latestInfo =
+ mSharedLibrariesImpl.getLatestStaticSharedLibraVersionLPr(newLibSetting.pkg)!!
assertThat(latestInfo).isNotNull()
assertThat(latestInfo.name).isEqualTo(STATIC_LIB_NAME)