diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 43c54b4a97b35..031ad42862255 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -60,6 +60,27 @@ import java.util.function.Consumer; * @hide Only for use within the system server. */ public abstract class PackageManagerInternal { + @IntDef(prefix = "PACKAGE_", value = { + PACKAGE_SYSTEM, + PACKAGE_SETUP_WIZARD, + PACKAGE_INSTALLER, + PACKAGE_VERIFIER, + PACKAGE_BROWSER, + PACKAGE_SYSTEM_TEXT_CLASSIFIER, + PACKAGE_PERMISSION_CONTROLLER, + PACKAGE_WELLBEING, + PACKAGE_DOCUMENTER, + PACKAGE_CONFIGURATOR, + PACKAGE_INCIDENT_REPORT_APPROVER, + PACKAGE_APP_PREDICTOR, + PACKAGE_OVERLAY_CONFIG_SIGNATURE, + PACKAGE_WIFI, + PACKAGE_COMPANION, + PACKAGE_RETAIL_DEMO, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface KnownPackage {} + public static final int PACKAGE_SYSTEM = 0; public static final int PACKAGE_SETUP_WIZARD = 1; public static final int PACKAGE_INSTALLER = 2; @@ -72,11 +93,13 @@ public abstract class PackageManagerInternal { public static final int PACKAGE_CONFIGURATOR = 9; public static final int PACKAGE_INCIDENT_REPORT_APPROVER = 10; public static final int PACKAGE_APP_PREDICTOR = 11; + public static final int PACKAGE_OVERLAY_CONFIG_SIGNATURE = 12; public static final int PACKAGE_WIFI = 13; public static final int PACKAGE_COMPANION = 14; public static final int PACKAGE_RETAIL_DEMO = 15; - public static final int PACKAGE_OVERLAY_CONFIG_SIGNATURE = 16; - public static final int LAST_KNOWN_PACKAGE = PACKAGE_OVERLAY_CONFIG_SIGNATURE; + // Integer value of the last known package ID. Increases as new ID is added to KnownPackage. + // Please note the numbers should be continuous. + public static final int LAST_KNOWN_PACKAGE = PACKAGE_RETAIL_DEMO; @IntDef(flag = true, prefix = "RESOLVE_", value = { RESOLVE_NON_BROWSER_ONLY, @@ -118,26 +141,6 @@ public abstract class PackageManagerInternal { */ public static final int INTEGRITY_VERIFICATION_REJECT = 0; - @IntDef(value = { - PACKAGE_SYSTEM, - PACKAGE_SETUP_WIZARD, - PACKAGE_INSTALLER, - PACKAGE_VERIFIER, - PACKAGE_BROWSER, - PACKAGE_SYSTEM_TEXT_CLASSIFIER, - PACKAGE_PERMISSION_CONTROLLER, - PACKAGE_WELLBEING, - PACKAGE_DOCUMENTER, - PACKAGE_CONFIGURATOR, - PACKAGE_INCIDENT_REPORT_APPROVER, - PACKAGE_APP_PREDICTOR, - PACKAGE_WIFI, - PACKAGE_COMPANION, - PACKAGE_RETAIL_DEMO, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface KnownPackage {} - /** Observer called whenever the list of packages changes */ public interface PackageListObserver { /** A package was added to the system. */ diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a656871d06d66..8ccafb81312b4 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -22259,11 +22259,8 @@ public class PackageManagerService extends IPackageManager.Stub final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120); ipw.println("Known Packages:"); ipw.increaseIndent(); - for (int i = 0; i < LAST_KNOWN_PACKAGE; i++) { + for (int i = 0; i <= LAST_KNOWN_PACKAGE; i++) { final String knownPackage = mPmInternal.knownPackageToString(i); - if ("Unknown".equals(knownPackage)) { - continue; - } ipw.print(knownPackage); ipw.println(":"); final String[] pkgNames = mPmInternal.getKnownPackageNames(i, diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java index 35d6f470a5046..d54a40e58af15 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java @@ -16,12 +16,21 @@ package com.android.server.pm; +import static com.google.common.truth.Truth.assertWithMessage; + +import static java.lang.reflect.Modifier.isFinal; +import static java.lang.reflect.Modifier.isPublic; +import static java.lang.reflect.Modifier.isStatic; + import android.content.IIntentReceiver; +import android.content.pm.PackageManagerInternal; import android.os.Bundle; import android.util.SparseArray; import androidx.test.runner.AndroidJUnit4; +import com.google.android.collect.Lists; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -29,6 +38,12 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.io.File; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.regex.Pattern; // runtest -c com.android.server.pm.PackageManagerServiceTest frameworks-services // bit FrameworksServicesTests:com.android.server.pm.PackageManagerServiceTest @@ -133,4 +148,51 @@ public class PackageManagerServiceTest { } } } + + @Test + public void testKnownPackageToString_shouldNotGetUnknown() { + final List packageNames = new ArrayList<>(); + for (int i = 0; i <= PackageManagerInternal.LAST_KNOWN_PACKAGE; i++) { + packageNames.add(PackageManagerInternal.knownPackageToString(i)); + } + assertWithMessage( + "The Ids of KnownPackage should be continuous and the string representation " + + "should not be unknown.").that( + packageNames).containsNoneIn(Lists.newArrayList("Unknown")); + } + + @Test + public void testKnownPackage_lastKnownPackageIsTheLast() throws Exception { + final List knownPackageIds = getKnownPackageIdsList(); + assertWithMessage( + "The last KnownPackage Id should be assigned to PackageManagerInternal" + + ".LAST_KNOWN_PACKAGE.").that( + knownPackageIds.get(knownPackageIds.size() - 1)).isEqualTo( + PackageManagerInternal.LAST_KNOWN_PACKAGE); + } + + @Test + public void testKnownPackage_IdsShouldBeUniqueAndContinuous() throws Exception { + final List knownPackageIds = getKnownPackageIdsList(); + for (int i = 0, size = knownPackageIds.size(); i < size - 1; i++) { + assertWithMessage( + "The KnownPackage Ids should be unique and continuous. KnownPackageIds = " + + Arrays.toString(knownPackageIds.toArray())).that( + knownPackageIds.get(i) + 1).isEqualTo(knownPackageIds.get(i + 1)); + } + } + + private List getKnownPackageIdsList() throws IllegalAccessException { + final ArrayList knownPackageIds = new ArrayList<>(); + final Field[] allFields = PackageManagerInternal.class.getDeclaredFields(); + for (Field field : allFields) { + final int modifier = field.getModifiers(); + if (isPublic(modifier) && isStatic(modifier) && isFinal(modifier) + && Pattern.matches("PACKAGE(_[A-Z]+)+", field.getName())) { + knownPackageIds.add(field.getInt(null)); + } + } + Collections.sort(knownPackageIds); + return knownPackageIds; + } }