From 3fa88533316995c52d29a14df600e477f83c04d9 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Mon, 18 Nov 2019 13:43:11 -0800 Subject: [PATCH] DO NOT MERGE Avoids deadlock when applying preferred activities Prior to this change, we were resolving the mime type of a given intent while holding the package lock. With this change, we instead rely on the preferred-activity declaration to define the mime type if it's important, removing need for an activity manager service call and the potential for deadlock. Fixes: 143105100 Test: Manual; sideload to /system/etc/preferred-apps/ and reset app preferences Change-Id: Ia87b7ecbd7987ef654fb0fc2bda942cd6a9c00a7 --- .../android/content/pm/PackageManagerInternal.java | 11 +++++++++++ .../com/android/server/pm/PackageManagerService.java | 6 ++++++ .../core/java/com/android/server/pm/Settings.java | 3 ++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 28d9152b37078..30a3bd4d07384 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -414,6 +414,17 @@ public abstract class PackageManagerInternal { public abstract List queryIntentActivities(Intent intent, @ResolveInfoFlags int flags, int filterCallingUid, int userId); + /** + * Retrieve all activities that can be performed for the given intent. + * @param filterCallingUid The results will be filtered in the context of this UID instead + * of the calling UID. + * @see PackageManager#queryIntentActivities(Intent, int) + */ + public abstract List queryIntentActivities( + Intent intent, @Nullable String resolvedType, @ResolveInfoFlags int flags, + int filterCallingUid, int userId); + + /** * Retrieve all services that can be performed for the given intent. * @see PackageManager#queryIntentServices(Intent, int) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d7d73451e74bd..54051ba64f8c9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -24520,6 +24520,12 @@ public class PackageManagerService extends IPackageManager.Stub public List queryIntentActivities( Intent intent, int flags, int filterCallingUid, int userId) { final String resolvedType = intent.resolveTypeIfNeeded(mContext.getContentResolver()); + return queryIntentActivities(intent, resolvedType, flags, filterCallingUid, userId); + } + + @Override + public List queryIntentActivities( + Intent intent, String resolvedType, int flags, int filterCallingUid, int userId) { return PackageManagerService.this .queryIntentActivitiesInternal(intent, resolvedType, flags, filterCallingUid, userId, false /*resolveForStart*/, true /*allowDynamicSplits*/); diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 3bc2236a82217..4ecfbfee6e654 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -3337,7 +3337,8 @@ public final class Settings { int flags, ComponentName cn, String scheme, PatternMatcher ssp, IntentFilter.AuthorityEntry auth, PatternMatcher path, int userId) { final List ri = - pmInternal.queryIntentActivities(intent, flags, Binder.getCallingUid(), 0); + pmInternal.queryIntentActivities( + intent, intent.getType(), flags, Binder.getCallingUid(), 0); if (PackageManagerService.DEBUG_PREFERRED) { Log.d(TAG, "Queried " + intent + " results: " + ri); }