From b28b7960b2bd2d33cbccd88d2d4d3c05e09f2770 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Wed, 6 Mar 2019 09:20:37 -0800 Subject: [PATCH 1/2] pm: PackageBackwardCompatibility -> applyPolicy This moves PackageBackwardCompatibility from parsePackage to applyPolicy. The motivation of this is to expose partition information to these files. Specifically, to expose whether the app is a pre-installed (or updated pre-installed app) for certain backwards compatibility rules that should only apply to these cases. Bug: 86259915 Test: boot Pixel 2 Test: Pixel 3: atest -p cts/tests/signature - all passed except for CtsSystemApiAnnotationTestCases test which failed (known issue b/124210145) Change-Id: Ic824f06489781233dc98bf3dc0182681d32f7142 --- core/java/android/content/pm/PackageParser.java | 2 -- .../core/java/com/android/server/pm/PackageManagerService.java | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) 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/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) From 2410821b670bdc76c2089124b152f14a0eeed218 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Wed, 6 Mar 2019 09:39:27 -0800 Subject: [PATCH 2/2] pm: AndroidHidlUpdater: system only Backwards compatibility takes a slight performance hit. Only apply this rule to outdated system apps as they are the only ones that use these libraries. Bug: 86259915 Test: boot Pixel 2 Test: boot Pixel 3 and systrace app startup Test: atest android.content.pm.AndroidHidlUpdaterTest Change-Id: I2d2e2ca79266a92ba0e4efcf25e31d15daee87a1 --- .../content/pm/AndroidHidlUpdater.java | 8 +++- .../content/pm/AndroidHidlUpdaterTest.java | 46 +++++++++++++++---- .../android/content/pm/PackageBuilder.java | 8 ++++ 3 files changed, 53 insertions(+), 9 deletions(-) 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/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;