From 2d9355bc449842c7cd0a58afb5095ee20453068d Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 29 Mar 2021 09:39:08 -0600 Subject: [PATCH] Continue populating legacy data structures. Previous work implemented getRequestedPermissions() by dynamically constructing the legacy list of requested permissions, along with a deprecation message to migrate to ParsedUsesPermission, but there are too many callers to migrate at this stage of the release. For now, to mitigate performance issues that arose, this change builds a parallel list of requested permissions to avoid the overhead of dynamically building the legacy list. Bug: 183223056 Test: atest FrameworksServicesTests:PackageParserTest Test: atest com.android.server.pm.parsing Test: atest -p core/java/android/content/pm \ core/java/com/android/internal/content \ services/core/java/com/android/server/pm \ services/tests/servicestests/src/com/android/server/pm Change-Id: I538fbc12a9fd34f5ad5d63177ac5a2cb9a1ff3ce --- .../pm/parsing/ParsingPackageImpl.java | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java index 60aac76fa8a5d..72c9879c93607 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java +++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java @@ -227,6 +227,14 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { @NonNull @DataClass.ParcelWith(ForInternedStringList.class) protected List adoptPermissions = emptyList(); + /** + * @deprecated consider migrating to {@link #getUsesPermissions} which has + * more parsed details, such as flags + */ + @NonNull + @Deprecated + @DataClass.ParcelWith(ForInternedStringList.class) + protected List requestedPermissions = emptyList(); @NonNull private List usesPermissions = emptyList(); @@ -701,6 +709,11 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { @Override public ParsingPackageImpl addUsesPermission(ParsedUsesPermission permission) { this.usesPermissions = CollectionUtils.add(this.usesPermissions, permission); + + // Continue populating legacy data structures to avoid performance + // issues until all that code can be migrated + this.requestedPermissions = CollectionUtils.add(this.requestedPermissions, permission.name); + return this; } @@ -1142,6 +1155,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { dest.writeByteArray(this.restrictUpdateHash); dest.writeStringList(this.originalPackages); sForInternedStringList.parcel(this.adoptPermissions, dest, flags); + sForInternedStringList.parcel(this.requestedPermissions, dest, flags); dest.writeTypedList(this.usesPermissions); sForInternedStringList.parcel(this.implicitPermissions, dest, flags); sForStringSet.parcel(this.upgradeKeySets, dest, flags); @@ -1264,6 +1278,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { this.restrictUpdateHash = in.createByteArray(); this.originalPackages = in.createStringArrayList(); this.adoptPermissions = sForInternedStringList.unparcel(in); + this.requestedPermissions = sForInternedStringList.unparcel(in); this.usesPermissions = in.createTypedArrayList(ParsedUsesPermission.CREATOR); this.implicitPermissions = sForInternedStringList.unparcel(in); this.upgradeKeySets = sForStringSet.unparcel(in); @@ -1558,15 +1573,14 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { return adoptPermissions; } + /** + * @deprecated consider migrating to {@link #getUsesPermissions} which has + * more parsed details, such as flags + */ @NonNull @Override + @Deprecated public List getRequestedPermissions() { - final List usesPermissions = getUsesPermissions(); - final int size = usesPermissions.size(); - final List requestedPermissions = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - requestedPermissions.add(usesPermissions.get(i).name); - } return requestedPermissions; }