diff options
| author | 2022-07-19 16:01:07 -0700 | |
|---|---|---|
| committer | 2022-07-20 18:16:57 +0000 | |
| commit | da1a68e6f6b91d1e6ee73ae7aae107c6db08507c (patch) | |
| tree | 7e4fe8bf498605b409c5ee10f320dc8e5fbdd87e | |
| parent | 531b63c1a690c8d8b57cc56cabddb0245fb32e03 (diff) | |
Use the same application info instance.
Bug: 238461609
Fixes: 238461609
Test: Follow the repro steps in the bug.
Change-Id: I0432ad981d8bd15d10874bc07bb89dfa0574eba5
| -rw-r--r-- | core/java/android/content/pm/PackageParser.java | 56 |
1 files changed, 48 insertions, 8 deletions
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 44dc28d2b0fa..c15b3e0b80c3 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -713,6 +713,15 @@ public class PackageParser { if (!checkUseInstalledOrHidden(flags, state, p.applicationInfo) || !p.isMatch(flags)) { return null; } + + final ApplicationInfo applicationInfo; + if ((flags & (PackageManager.GET_ACTIVITIES | PackageManager.GET_RECEIVERS + | PackageManager.GET_SERVICES | PackageManager.GET_PROVIDERS)) != 0) { + applicationInfo = generateApplicationInfo(p, flags, state, userId); + } else { + applicationInfo = null; + } + PackageInfo pi = new PackageInfo(); pi.packageName = p.packageName; pi.splitNames = p.splitNames; @@ -773,7 +782,7 @@ public class PackageParser { if (PackageManager.APP_DETAILS_ACTIVITY_CLASS_NAME.equals(a.className)) { continue; } - res[num++] = generateActivityInfo(a, flags, state, userId); + res[num++] = generateActivityInfo(a, flags, state, userId, applicationInfo); } } pi.activities = ArrayUtils.trimToSize(res, num); @@ -787,7 +796,7 @@ public class PackageParser { for (int i = 0; i < N; i++) { final Activity a = p.receivers.get(i); if (isMatch(state, a.info, flags)) { - res[num++] = generateActivityInfo(a, flags, state, userId); + res[num++] = generateActivityInfo(a, flags, state, userId, applicationInfo); } } pi.receivers = ArrayUtils.trimToSize(res, num); @@ -801,7 +810,7 @@ public class PackageParser { for (int i = 0; i < N; i++) { final Service s = p.services.get(i); if (isMatch(state, s.info, flags)) { - res[num++] = generateServiceInfo(s, flags, state, userId); + res[num++] = generateServiceInfo(s, flags, state, userId, applicationInfo); } } pi.services = ArrayUtils.trimToSize(res, num); @@ -815,7 +824,8 @@ public class PackageParser { for (int i = 0; i < N; i++) { final Provider pr = p.providers.get(i); if (isMatch(state, pr.info, flags)) { - res[num++] = generateProviderInfo(pr, flags, state, userId); + res[num++] = generateProviderInfo(pr, flags, state, userId, + applicationInfo); } } pi.providers = ArrayUtils.trimToSize(res, num); @@ -8216,6 +8226,11 @@ public class PackageParser { @UnsupportedAppUsage public static final ActivityInfo generateActivityInfo(Activity a, int flags, FrameworkPackageUserState state, int userId) { + return generateActivityInfo(a, flags, state, userId, null); + } + + private static ActivityInfo generateActivityInfo(Activity a, int flags, + FrameworkPackageUserState state, int userId, ApplicationInfo applicationInfo) { if (a == null) return null; if (!checkUseInstalledOrHidden(flags, state, a.owner.applicationInfo)) { return null; @@ -8227,7 +8242,12 @@ public class PackageParser { // Make shallow copies so we can store the metadata safely ActivityInfo ai = new ActivityInfo(a.info); ai.metaData = a.metaData; - ai.applicationInfo = generateApplicationInfo(a.owner, flags, state, userId); + + if (applicationInfo == null) { + applicationInfo = generateApplicationInfo(a.owner, flags, state, userId); + } + ai.applicationInfo = applicationInfo; + return ai; } @@ -8308,6 +8328,11 @@ public class PackageParser { @UnsupportedAppUsage public static final ServiceInfo generateServiceInfo(Service s, int flags, FrameworkPackageUserState state, int userId) { + return generateServiceInfo(s, flags, state, userId, null); + } + + private static ServiceInfo generateServiceInfo(Service s, int flags, + FrameworkPackageUserState state, int userId, ApplicationInfo applicationInfo) { if (s == null) return null; if (!checkUseInstalledOrHidden(flags, state, s.owner.applicationInfo)) { return null; @@ -8319,7 +8344,12 @@ public class PackageParser { // Make shallow copies so we can store the metadata safely ServiceInfo si = new ServiceInfo(s.info); si.metaData = s.metaData; - si.applicationInfo = generateApplicationInfo(s.owner, flags, state, userId); + + if (applicationInfo == null) { + applicationInfo = generateApplicationInfo(s.owner, flags, state, userId); + } + si.applicationInfo = applicationInfo; + return si; } @@ -8406,13 +8436,18 @@ public class PackageParser { @UnsupportedAppUsage public static final ProviderInfo generateProviderInfo(Provider p, int flags, FrameworkPackageUserState state, int userId) { + return generateProviderInfo(p, flags, state, userId, null); + } + + private static ProviderInfo generateProviderInfo(Provider p, int flags, + FrameworkPackageUserState state, int userId, ApplicationInfo applicationInfo) { if (p == null) return null; if (!checkUseInstalledOrHidden(flags, state, p.owner.applicationInfo)) { return null; } if (!copyNeeded(flags, p.owner, state, p.metaData, userId) && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0 - || p.info.uriPermissionPatterns == null)) { + || p.info.uriPermissionPatterns == null)) { updateApplicationInfo(p.info.applicationInfo, flags, state); return p.info; } @@ -8422,7 +8457,12 @@ public class PackageParser { if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) { pi.uriPermissionPatterns = null; } - pi.applicationInfo = generateApplicationInfo(p.owner, flags, state, userId); + + if (applicationInfo == null) { + applicationInfo = generateApplicationInfo(p.owner, flags, state, userId); + } + pi.applicationInfo = applicationInfo; + return pi; } |