From c2deeefef2abff2ce355d012a0bd2b1cd8258d18 Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Tue, 31 Mar 2020 19:51:34 -0700 Subject: [PATCH] Ensure that loading packages can be extended Collections.emptySet() creates an immutable collection which will prevent us to add more packages to the loading packages set. Instead of using the emptySet, create a new set everytime, even if it's empty. Test: PackageDexUseTest Bug: 148774920 Change-Id: If274d0380d494d31768da24c10153810ef8bf513 --- .../android/server/pm/dex/PackageDexUsage.java | 9 +++------ .../server/pm/dex/PackageDexUsageTests.java | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java index 7ac09e373d20a..10760f52a02bc 100644 --- a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java +++ b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java @@ -446,15 +446,12 @@ public class PackageDexUsage extends AbstractStatsBase { if (line == null) { throw new IllegalStateException("Could not find the loadingPackages line."); } - // We expect that most of the times the list of loading packages will be empty. - if (line.length() == LOADING_PACKAGE_CHAR.length()) { - return Collections.emptySet(); - } else { - Set result = new HashSet<>(); + Set result = new HashSet<>(); + if (line.length() != LOADING_PACKAGE_CHAR.length()) { Collections.addAll(result, line.substring(LOADING_PACKAGE_CHAR.length()).split(SPLIT_CHAR)); - return result; } + return result; } /** diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java index 2829fa7bf83f7..adf4551e79a89 100644 --- a/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/dex/PackageDexUsageTests.java @@ -575,6 +575,22 @@ public class PackageDexUsageTests { assertPackageDexUsage(mBarBaseUser0); } + @Test + public void testEnsureLoadingPackagesCanBeExtended() { + String isa = VMRuntime.getInstructionSet(Build.SUPPORTED_ABIS[0]); + String content = "PACKAGE_MANAGER__PACKAGE_DEX_USAGE__2\n" + + "com.google.foo\n" + + "+/data/app/com.google.foo/split-2.apk\n" + + "@\n"; + PackageDexUsage packageDexUsage = new PackageDexUsage(); + try { + packageDexUsage.read(new StringReader(content)); + } catch (IOException e) { + fail(); + } + record(packageDexUsage, mFooSplit2UsedByOtherApps0, mFooSplit2UsedByOtherApps0.getUsedBy()); + } + private void assertPackageDexUsage(TestData primary, TestData... secondaries) { assertPackageDexUsage(mPackageDexUsage, null, primary, secondaries); }