diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 68 |
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 |