From c7bacab20fa8a0e603726f4f8ebafd3a96babeb1 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Tue, 9 Feb 2016 15:56:11 -0700 Subject: [PATCH] More encryption-aware triaging. Most of these callers are okay having results omitted when a package is uninstalled or encryption unaware. For example, jobs and notifications can only be enqueued by already running apps. When clearing zen rules, keep around rules inserted by apps on ejected external storage devices. Make ServiceWatcher stricter by requiring that the matching package be in the system image. Bug: 26471205, 27105254 Change-Id: Ie41ea8042ac1a54e9cbe0c35cec89e70521e9bed --- core/java/android/app/LoadedApk.java | 3 ++- core/java/android/app/SearchableInfo.java | 3 ++- services/core/java/com/android/server/ServiceWatcher.java | 5 ++--- .../core/java/com/android/server/am/ActivityManagerService.java | 9 +++++++-- .../core/java/com/android/server/job/JobSchedulerService.java | 3 ++- .../android/server/notification/NotificationManagerService.java | 3 ++- .../core/java/com/android/server/notification/ZenModeHelper.java | 3 ++- 7 files changed, 19 insertions(+), 10 deletions(-) diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index da52c1e5ba1d..87173532ae51 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -447,7 +447,8 @@ public final class LoadedApk { IPackageManager pm = ActivityThread.getPackageManager(); android.content.pm.PackageInfo pi; try { - pi = pm.getPackageInfo(mPackageName, 0, UserHandle.myUserId()); + pi = pm.getPackageInfo(mPackageName, PackageManager.MATCH_DEBUG_TRIAGED_MISSING, + UserHandle.myUserId()); } catch (RemoteException e) { throw new IllegalStateException("Unable to get package info for " + mPackageName + "; is system dying?", e); diff --git a/core/java/android/app/SearchableInfo.java b/core/java/android/app/SearchableInfo.java index c7d2140d042d..a95291514936 100644 --- a/core/java/android/app/SearchableInfo.java +++ b/core/java/android/app/SearchableInfo.java @@ -363,7 +363,8 @@ public final class SearchableInfo implements Parcelable { String suggestProviderPackage = null; if (mSuggestAuthority != null) { PackageManager pm = activityContext.getPackageManager(); - ProviderInfo pi = pm.resolveContentProvider(mSuggestAuthority, 0); + ProviderInfo pi = pm.resolveContentProvider(mSuggestAuthority, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING); if (pi != null) { suggestProviderPackage = pi.packageName; } diff --git a/services/core/java/com/android/server/ServiceWatcher.java b/services/core/java/com/android/server/ServiceWatcher.java index 9a773f2f7234..383e25a6d293 100644 --- a/services/core/java/com/android/server/ServiceWatcher.java +++ b/services/core/java/com/android/server/ServiceWatcher.java @@ -92,9 +92,8 @@ public class ServiceWatcher implements ServiceConnection { String pkg = initialPackageNames.get(i); try { HashSet set = new HashSet(); - Signature[] sigs = pm.getPackageInfo(pkg, - PackageManager.MATCH_ENCRYPTION_AWARE_AND_UNAWARE - | PackageManager.GET_SIGNATURES).signatures; + Signature[] sigs = pm.getPackageInfo(pkg, PackageManager.MATCH_SYSTEM_ONLY + | PackageManager.GET_SIGNATURES).signatures; set.addAll(Arrays.asList(sigs)); sigSets.add(set); } catch (NameNotFoundException e) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 9dae74050812..002feefd1720 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -10722,6 +10722,12 @@ public final class ActivityManagerService extends ActivityManagerNative return; } + // We're only interested in providers that are encryption unaware, and + // we don't care about uninstalled apps, since there's no way they're + // running at this point. + final int matchFlags = GET_PROVIDERS | MATCH_ENCRYPTION_UNAWARE + | MATCH_DEBUG_TRIAGED_MISSING; + synchronized (this) { final int NP = mProcessNames.getMap().size(); for (int ip = 0; ip < NP; ip++) { @@ -10736,8 +10742,7 @@ public final class ActivityManagerService extends ActivityManagerNative try { final String pkgName = app.pkgList.keyAt(ig); final PackageInfo pkgInfo = AppGlobals.getPackageManager() - .getPackageInfo(pkgName, - GET_PROVIDERS | MATCH_ENCRYPTION_UNAWARE, userId); + .getPackageInfo(pkgName, matchFlags, userId); if (pkgInfo != null && !ArrayUtils.isEmpty(pkgInfo.providers)) { for (ProviderInfo provInfo : pkgInfo.providers) { Log.v(TAG, "Installing " + provInfo); diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index 4c2699891893..e5e86ac44a26 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -1024,7 +1024,8 @@ public class JobSchedulerService extends com.android.server.SystemService final IPackageManager pm = AppGlobals.getPackageManager(); final ComponentName service = job.getService(); try { - ServiceInfo si = pm.getServiceInfo(service, 0, UserHandle.getUserId(uid)); + ServiceInfo si = pm.getServiceInfo(service, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, UserHandle.getUserId(uid)); if (si == null) { throw new IllegalArgumentException("No such service " + service); } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index bf8e8fb4eb47..ba4547c14ea3 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -3480,7 +3480,8 @@ public class NotificationManagerService extends SystemService { try { // TODO: it might be faster to return a boolean from package manager rather than the // whole application info. Revisit and make the API change. - ai = AppGlobals.getPackageManager().getApplicationInfo(pkg, 0, userId); + ai = AppGlobals.getPackageManager().getApplicationInfo(pkg, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId); if (ai == null) { Slog.w(TAG, "No application info for package " + pkg + " and user " + userId); return false; diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index bba0d402c90e..383c1ab5ebef 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -578,7 +578,8 @@ public class ZenModeHelper { ZenRule rule = newConfig.automaticRules.get(newConfig.automaticRules.keyAt(i)); if (RULE_INSTANCE_GRACE_PERIOD < (currentTime - rule.creationTime)) { try { - mPm.getPackageInfo(rule.component.getPackageName(), 0); + mPm.getPackageInfo(rule.component.getPackageName(), + PackageManager.MATCH_UNINSTALLED_PACKAGES); } catch (PackageManager.NameNotFoundException e) { newConfig.automaticRules.removeAt(i); } -- 2.11.0