diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 2b3bfc82f9828..2a1270fc585c5 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -325,6 +325,7 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -9846,7 +9847,8 @@ public class PackageManagerService extends IPackageManager.Stub } } - private void addSharedLibraryLPr(ArraySet usesLibraryFiles, SharedLibraryEntry file, + private void addSharedLibraryLPr(Set usesLibraryFiles, + SharedLibraryEntry file, PackageParser.Package changingLib) { if (file.path != null) { usesLibraryFiles.add(file.path); @@ -9875,7 +9877,10 @@ public class PackageManagerService extends IPackageManager.Stub if (pkg == null) { return; } - ArraySet usesLibraryFiles = null; + // The collection used here must maintain the order of addition (so + // that libraries are searched in the correct order) and must have no + // duplicates. + Set usesLibraryFiles = null; if (pkg.usesLibraries != null) { usesLibraryFiles = addSharedLibrariesLPw(pkg.usesLibraries, null, null, pkg.packageName, changingLib, true, null); @@ -9896,10 +9901,10 @@ public class PackageManagerService extends IPackageManager.Stub } } - private ArraySet addSharedLibrariesLPw(@NonNull List requestedLibraries, + private Set addSharedLibrariesLPw(@NonNull List requestedLibraries, @Nullable int[] requiredVersions, @Nullable String[] requiredCertDigests, @NonNull String packageName, @Nullable PackageParser.Package changingLib, - boolean required, @Nullable ArraySet outUsedLibraries) + boolean required, @Nullable Set outUsedLibraries) throws PackageManagerException { final int libCount = requestedLibraries.size(); for (int i = 0; i < libCount; i++) { @@ -9944,7 +9949,9 @@ public class PackageManagerService extends IPackageManager.Stub } if (outUsedLibraries == null) { - outUsedLibraries = new ArraySet<>(); + // Use LinkedHashSet to preserve the order of files added to + // usesLibraryFiles while eliminating duplicates. + outUsedLibraries = new LinkedHashSet<>(); } addSharedLibraryLPr(outUsedLibraries, libEntry, changingLib); }