summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java68
1 files changed, 54 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index fa98c962afbf..b0ba27c31a71 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -22874,39 +22874,79 @@ public class PackageManagerService extends IPackageManager.Stub
return pkg == null ? null : pkg.packageName;
}
+ /**
+ * Only keep package names that refer to {@link PackageParser.Package#isSystem system}
+ * packages.
+ *
+ * @param pkgNames The packages to filter
+ *
+ * @return The filtered packages
+ */
+ private @NonNull String[] filterOnlySystemPackages(@Nullable String... pkgNames) {
+ if (pkgNames == null) {
+ return ArrayUtils.emptyArray(String.class);
+ }
+
+ ArrayList<String> systemPackageNames = new ArrayList<>(pkgNames.length);
+
+ for (String pkgName: pkgNames) {
+ synchronized (mPackages) {
+ if (pkgName == null) {
+ continue;
+ }
+
+ PackageParser.Package pkg = getPackage(pkgName);
+ if (pkg == null) {
+ Log.w(TAG, "Could not find package " + pkgName);
+ continue;
+ }
+
+ if (!pkg.isSystem()) {
+ Log.w(TAG, pkgName + " is not system");
+ continue;
+ }
+
+ systemPackageNames.add(pkgName);
+ }
+ }
+
+ return systemPackageNames.toArray(new String[]{});
+ }
+
@Override
public @NonNull String[] getKnownPackageNames(int knownPackage, int userId) {
- switch(knownPackage) {
+ switch (knownPackage) {
case PackageManagerInternal.PACKAGE_BROWSER:
return new String[]{mPermissionManager.getDefaultBrowser(userId)};
case PackageManagerInternal.PACKAGE_INSTALLER:
- return new String[]{mRequiredInstallerPackage};
+ return filterOnlySystemPackages(mRequiredInstallerPackage);
case PackageManagerInternal.PACKAGE_SETUP_WIZARD:
- return new String[]{mSetupWizardPackage};
+ return filterOnlySystemPackages(mSetupWizardPackage);
case PackageManagerInternal.PACKAGE_SYSTEM:
return new String[]{"android"};
case PackageManagerInternal.PACKAGE_VERIFIER:
- return new String[]{mRequiredVerifierPackage};
+ return filterOnlySystemPackages(mRequiredVerifierPackage);
case PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER:
- return new String[]{mSystemTextClassifierPackage};
+ return filterOnlySystemPackages(mSystemTextClassifierPackage);
case PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER:
- return new String[]{mRequiredPermissionControllerPackage};
+ return filterOnlySystemPackages(mRequiredPermissionControllerPackage);
case PackageManagerInternal.PACKAGE_WELLBEING:
- return new String[]{mWellbeingPackage};
+ return filterOnlySystemPackages(mWellbeingPackage);
case PackageManagerInternal.PACKAGE_DOCUMENTER:
- return new String[]{mDocumenterPackage};
+ return filterOnlySystemPackages(mDocumenterPackage);
case PackageManagerInternal.PACKAGE_CONFIGURATOR:
- return new String[]{mConfiguratorPackage};
+ return filterOnlySystemPackages(mConfiguratorPackage);
case PackageManagerInternal.PACKAGE_INCIDENT_REPORT_APPROVER:
- return new String[]{mIncidentReportApproverPackage};
+ return filterOnlySystemPackages(mIncidentReportApproverPackage);
case PackageManagerInternal.PACKAGE_APP_PREDICTOR:
- return new String[]{mAppPredictionServicePackage};
+ return filterOnlySystemPackages(mAppPredictionServicePackage);
case PackageManagerInternal.PACKAGE_TELEPHONY:
- return mTelephonyPackages;
+ return filterOnlySystemPackages(mTelephonyPackages);
case PackageManagerInternal.PACKAGE_WIFI:
- return new String[]{mWifiPackage};
+ return filterOnlySystemPackages(mWifiPackage);
+ default:
+ return ArrayUtils.emptyArray(String.class);
}
- return ArrayUtils.emptyArray(String.class);
}
@Override