From 9b73080d0c215fd578ceb277ef04fee8e7128246 Mon Sep 17 00:00:00 2001 From: Sergey Nikolaienkov Date: Fri, 18 Feb 2022 14:58:15 +0100 Subject: [PATCH] Optimize checking if package defines companion services in CDM Check if the companion application defines CompanionDeviceServices before attempting to create CompanionDeviceServiceConnector and before acquering mBoundCompanionApplications lock in CompanionApplicationController.bindCompanionApplication(). Add more debug logging (under DEBUG flag). Remove unused CompanionServicesRegister.primaryForPackage() method. Bug: 222237190 Test: atest CtsCompanionDeviceManagerCoreTestCases Test: atest CtsCompanionDeviceManagerNoCompanionServicesTestCases Change-Id: Iee7d3feec89147c9585bcfb620eb2566ee685be3 --- .../CompanionApplicationController.java | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/services/companion/java/com/android/server/companion/CompanionApplicationController.java b/services/companion/java/com/android/server/companion/CompanionApplicationController.java index ec4bfe09e415b..f32eebc2a31f6 100644 --- a/services/companion/java/com/android/server/companion/CompanionApplicationController.java +++ b/services/companion/java/com/android/server/companion/CompanionApplicationController.java @@ -108,8 +108,16 @@ class CompanionApplicationController { final List companionServices = mCompanionServicesRegister.forPackage(userId, packageName); - final List serviceConnectors; + if (companionServices.isEmpty()) { + Slog.w(TAG, "Can not bind companion applications u" + userId + "/" + packageName + ": " + + "eligible CompanionDeviceService not found.\n" + + "A CompanionDeviceService should declare an intent-filter for " + + "\"android.companion.CompanionDeviceService\" action and require " + + "\"android.permission.BIND_COMPANION_DEVICE_SERVICE\" permission."); + return; + } + final List serviceConnectors; synchronized (mBoundCompanionApplications) { if (mBoundCompanionApplications.containsValueForPackage(userId, packageName)) { if (DEBUG) Log.e(TAG, "u" + userId + "/" + packageName + " is ALREADY bound."); @@ -118,13 +126,6 @@ class CompanionApplicationController { serviceConnectors = CollectionUtils.map(companionServices, componentName -> new CompanionDeviceServiceConnector(mContext, userId, componentName)); - - if (serviceConnectors.isEmpty()) { - Slog.e(TAG, "Can't find CompanionDeviceService implementer in package: " - + packageName + ". Please check if they are correctly declared."); - return; - } - mBoundCompanionApplications.setValueForPackage(userId, packageName, serviceConnectors); } @@ -145,7 +146,11 @@ class CompanionApplicationController { serviceConnectors = mBoundCompanionApplications.removePackage(userId, packageName); } if (serviceConnectors == null) { - if (DEBUG) Log.e(TAG, "u" + userId + "/" + packageName + " is NOT bound"); + if (DEBUG) { + Log.e(TAG, "unbindCompanionApplication(): " + + "u" + userId + "/" + packageName + " is NOT bound"); + Log.d(TAG, "Stacktrace", new Throwable()); + } return; } @@ -191,7 +196,11 @@ class CompanionApplicationController { final CompanionDeviceServiceConnector primaryServiceConnector = getPrimaryServiceConnector(userId, packageName); if (primaryServiceConnector == null) { - if (DEBUG) Log.e(TAG, "u" + userId + "/" + packageName + " is NOT bound."); + if (DEBUG) { + Log.e(TAG, "notify_CompanionApplicationDevice_Appeared(): " + + "u" + userId + "/" + packageName + " is NOT bound."); + Log.d(TAG, "Stacktrace", new Throwable()); + } return; } @@ -209,7 +218,11 @@ class CompanionApplicationController { final CompanionDeviceServiceConnector primaryServiceConnector = getPrimaryServiceConnector(userId, packageName); if (primaryServiceConnector == null) { - if (DEBUG) Log.e(TAG, "u" + userId + "/" + packageName + " is NOT bound."); + if (DEBUG) { + Log.e(TAG, "notify_CompanionApplicationDevice_Disappeared(): " + + "u" + userId + "/" + packageName + " is NOT bound."); + Log.d(TAG, "Stacktrace", new Throwable()); + } return; } @@ -253,12 +266,6 @@ class CompanionApplicationController { return forUser(userId).getOrDefault(packageName, Collections.emptyList()); } - synchronized @NonNull ComponentName primaryForPackage( - @UserIdInt int userId, @NonNull String packageName) { - // The primary service is always at the head of the list. - return forPackage(userId, packageName).get(0); - } - synchronized void invalidate(@UserIdInt int userId) { remove(userId); }