diff --git a/core/java/android/content/pm/AndroidHidlUpdater.java b/core/java/android/content/pm/AndroidHidlUpdater.java index b7ae8f4a12910..d0657e5eb8ec3 100644 --- a/core/java/android/content/pm/AndroidHidlUpdater.java +++ b/core/java/android/content/pm/AndroidHidlUpdater.java @@ -34,8 +34,14 @@ public class AndroidHidlUpdater extends PackageSharedLibraryUpdater { @Override public void updatePackage(Package pkg) { + ApplicationInfo info = pkg.applicationInfo; + // This was the default <= P and is maintained for backwards compatibility. - if (pkg.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.P) { + boolean isLegacy = info.targetSdkVersion <= Build.VERSION_CODES.P; + // Only system apps use these libraries + boolean isSystem = info.isSystemApp() || info.isUpdatedSystemApp(); + + if (isLegacy && isSystem) { prefixRequiredLibrary(pkg, ANDROID_HIDL_BASE); prefixRequiredLibrary(pkg, ANDROID_HIDL_MANAGER); } else { diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index ecb9dbf386141..d710d57d8f0be 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3857,8 +3857,6 @@ public class PackageParser { // every activity info has had a chance to set it from its attributes. setMaxAspectRatio(owner); - PackageBackwardCompatibility.modifySharedLibraries(owner); - if (hasDomainURLs(owner)) { owner.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS; } else { diff --git a/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java b/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java index 2acb08da4ef09..f557ef9835dae 100644 --- a/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java +++ b/core/tests/coretests/src/android/content/pm/AndroidHidlUpdaterTest.java @@ -40,8 +40,17 @@ public class AndroidHidlUpdaterTest extends PackageSharedLibraryUpdaterTest { PackageBuilder before = builder() .targetSdkVersion(Build.VERSION_CODES.P); + // no change, not system + checkBackwardsCompatibility(before, before); + } + + @Test + public void targeted_at_P_system() { + PackageBuilder before = builder().asSystemApp() + .targetSdkVersion(Build.VERSION_CODES.P); + // Should add both HIDL libraries - PackageBuilder after = builder() + PackageBuilder after = builder().asSystemApp() .targetSdkVersion(Build.VERSION_CODES.P) .requiredLibraries(ANDROID_HIDL_MANAGER, ANDROID_HIDL_BASE); @@ -54,9 +63,19 @@ public class AndroidHidlUpdaterTest extends PackageSharedLibraryUpdaterTest { .targetSdkVersion(Build.VERSION_CODES.P) .requiredLibraries(OTHER_LIBRARY); + // no change, not system + checkBackwardsCompatibility(before, before); + } + + @Test + public void targeted_at_P_not_empty_usesLibraries_system() { + PackageBuilder before = builder().asSystemApp() + .targetSdkVersion(Build.VERSION_CODES.P) + .requiredLibraries(OTHER_LIBRARY); + // The hidl jars should be added at the start of the list because it // is not on the bootclasspath and the package targets pre-P. - PackageBuilder after = builder() + PackageBuilder after = builder().asSystemApp() .targetSdkVersion(Build.VERSION_CODES.P) .requiredLibraries(ANDROID_HIDL_MANAGER, ANDROID_HIDL_BASE, OTHER_LIBRARY); @@ -69,8 +88,21 @@ public class AndroidHidlUpdaterTest extends PackageSharedLibraryUpdaterTest { .targetSdkVersion(Build.VERSION_CODES.P) .requiredLibraries(ANDROID_HIDL_MANAGER, ANDROID_HIDL_BASE); - // No change is required because although the HIDL libraries has been removed from - // the bootclasspath the package explicitly requests it. + PackageBuilder after = builder() + .targetSdkVersion(Build.VERSION_CODES.P); + + // Libraries are removed because they are not available for non-system apps + checkBackwardsCompatibility(before, after); + } + + @Test + public void targeted_at_P_in_usesLibraries_system() { + PackageBuilder before = builder().asSystemApp() + .targetSdkVersion(Build.VERSION_CODES.P) + .requiredLibraries(ANDROID_HIDL_MANAGER, ANDROID_HIDL_BASE); + + // No change is required because the package explicitly requests the HIDL libraries + // and is targeted at the current version so does not need backwards compatibility. checkBackwardsCompatibility(before, before); } @@ -81,8 +113,7 @@ public class AndroidHidlUpdaterTest extends PackageSharedLibraryUpdaterTest { // Dependency is removed, it is not available. PackageBuilder after = builder(); - // No change is required because the package explicitly requests the HIDL libraries - // and is targeted at the current version so does not need backwards compatibility. + // Libraries are removed because they are not available for apps targetting Q+ checkBackwardsCompatibility(before, after); } @@ -93,8 +124,7 @@ public class AndroidHidlUpdaterTest extends PackageSharedLibraryUpdaterTest { // Dependency is removed, it is not available. PackageBuilder after = builder(); - // No change is required because the package explicitly requests the HIDL libraries - // and is targeted at the current version so does not need backwards compatibility. + // Libraries are removed because they are not available for apps targetting Q+ checkBackwardsCompatibility(before, after); } diff --git a/core/tests/coretests/src/android/content/pm/PackageBuilder.java b/core/tests/coretests/src/android/content/pm/PackageBuilder.java index 4ceed834aab79..f5be3f79191a0 100644 --- a/core/tests/coretests/src/android/content/pm/PackageBuilder.java +++ b/core/tests/coretests/src/android/content/pm/PackageBuilder.java @@ -30,6 +30,8 @@ class PackageBuilder { private int mTargetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT; + private int mFlags = 0; + private ArrayList mRequiredLibraries; private ArrayList mOptionalLibraries; @@ -41,6 +43,7 @@ class PackageBuilder { public PackageParser.Package build() { PackageParser.Package pkg = new PackageParser.Package("org.package.name"); pkg.applicationInfo.targetSdkVersion = mTargetSdkVersion; + pkg.applicationInfo.flags = mFlags; pkg.usesLibraries = mRequiredLibraries; pkg.usesOptionalLibraries = mOptionalLibraries; return pkg; @@ -51,6 +54,11 @@ class PackageBuilder { return this; } + PackageBuilder asSystemApp() { + this.mFlags |= ApplicationInfo.FLAG_SYSTEM; + return this; + } + PackageBuilder requiredLibraries(String... names) { this.mRequiredLibraries = arrayListOrNull(names); return this; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a98e2d3fd0dad..2f510a7141b53 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -168,6 +168,7 @@ import android.content.pm.InstantAppRequest; import android.content.pm.InstantAppResolveInfo; import android.content.pm.InstrumentationInfo; import android.content.pm.IntentFilterVerificationInfo; +import android.content.pm.PackageBackwardCompatibility; import android.content.pm.KeySet; import android.content.pm.PackageCleanItem; import android.content.pm.PackageInfo; @@ -11043,6 +11044,8 @@ public class PackageManagerService extends IPackageManager.Stub pkg.mRealPackage = null; pkg.mAdoptPermissions = null; } + + PackageBackwardCompatibility.modifySharedLibraries(pkg); } private static @NonNull T assertNotNull(@Nullable T object, String message)