diff --git a/services/core/java/com/android/server/ServiceWatcher.java b/services/core/java/com/android/server/ServiceWatcher.java index 383e25a6d293c..2ff036be4b4b8 100644 --- a/services/core/java/com/android/server/ServiceWatcher.java +++ b/services/core/java/com/android/server/ServiceWatcher.java @@ -141,8 +141,12 @@ public class ServiceWatcher implements ServiceConnection { *
* Note that if there are no matching encryption-aware services, we may not * bind to a real service until after the current user is unlocked. + * + * @returns {@code true} if a potential service implementation was found. */ public boolean start() { + if (isServiceMissing()) return false; + synchronized (mLock) { bindBestPackageLocked(mServicePackageName, false); } @@ -173,6 +177,17 @@ public class ServiceWatcher implements ServiceConnection { return true; } + /** + * Check if any instance of this service is present on the device, + * regardless of it being encryption-aware or not. + */ + private boolean isServiceMissing() { + final Intent intent = new Intent(mAction); + final int flags = PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE; + return mPm.queryIntentServicesAsUser(intent, flags, mCurrentUserId).isEmpty(); + } + /** * Searches and binds to the best package, or do nothing if the best package * is already bound, unless force rebinding is requested. @@ -181,7 +196,7 @@ public class ServiceWatcher implements ServiceConnection { * packages if it is {@code null}. * @param forceRebind Force a rebinding to the best package if it's already * bound. - * @return {@code true} if a valid package was found to bind to. + * @returns {@code true} if a valid package was found to bind to. */ private boolean bindBestPackageLocked(String justCheckThisPackage, boolean forceRebind) { Intent intent = new Intent(mAction);