From 69a3f399fe0974e683cfabc2cf596dd76b9ec709 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Wed, 29 Apr 2020 21:34:24 +0100 Subject: [PATCH] Teach PackageManager.getApplicationInfo about MATCH_APEX Test: atest android.content.pm.cts.PackageManagerTest#testGetApplicationInfo_ApexSupported_MatchesApex Bug: 155092136 Change-Id: I489e186242d4db4de4753a11e90ce23e35f2aa80 --- core/java/android/content/pm/PackageManager.java | 1 + .../android/server/pm/PackageManagerService.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 6a5e6ca289b35..e107ede6edce2 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -180,6 +180,7 @@ public abstract class PackageManager { GET_DISABLED_UNTIL_USED_COMPONENTS, GET_UNINSTALLED_PACKAGES, MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS, + MATCH_APEX, }) @Retention(RetentionPolicy.SOURCE) public @interface ApplicationInfoFlags {} diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 90ca83e0770f5..4f100cc2c1b35 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4944,6 +4944,21 @@ public class PackageManagerService extends IPackageManager.Stub } return ai; } + if ((flags & PackageManager.MATCH_APEX) != 0) { + // For APKs, PackageInfo.applicationInfo is not exactly the same as ApplicationInfo + // returned from getApplicationInfo, but for APEX packages difference shouldn't be + // very big. + // TODO(b/155328545): generate proper application info for APEXes as well. + int apexFlags = ApexManager.MATCH_ACTIVE_PACKAGE; + if ((flags & PackageManager.MATCH_SYSTEM_ONLY) != 0) { + apexFlags = ApexManager.MATCH_FACTORY_PACKAGE; + } + final PackageInfo pi = mApexManager.getPackageInfo(packageName, apexFlags); + if (pi == null) { + return null; + } + return pi.applicationInfo; + } if ("android".equals(packageName)||"system".equals(packageName)) { return mAndroidApplication; }