From 3d9fc0f924a156ac940a895c86474413982c7268 Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Wed, 11 Mar 2020 10:19:04 +0800 Subject: [PATCH] Show class name in error message Show class name instead of service name in error message Context#getSystemService to make developers easier to debug. Bug: 150632074 Test: manual - check error log Change-Id: Icb00c972c3a4fd4c71383dd5da29d4864bb06379 --- core/java/android/app/ContextImpl.java | 5 +++-- core/java/android/app/SystemServiceRegistry.java | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 56e6aee83a44d..9ccfe8df14c2b 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -1899,8 +1899,9 @@ class ContextImpl extends Context { public Object getSystemService(String name) { // Check incorrect Context usage. if (isUiComponent(name) && !isUiContext() && vmIncorrectContextUseEnabled()) { - final String errorMessage = "Tried to access visual service " + name - + " from a non-visual Context."; + final String errorMessage = "Tried to access visual service " + + SystemServiceRegistry.getSystemServiceClassName(name) + + " from a non-visual Context. "; final String message = "Visual services, such as WindowManager, WallpaperService or " + "LayoutInflater should be accessed from Activity or other visual Context. " + "Use an Activity or a Context created with " diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index a3bcc9cee39bf..e8f30df614f3c 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -19,6 +19,7 @@ package android.app; import android.accounts.AccountManager; import android.accounts.IAccountManager; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.app.ContextImpl.ServiceInitializationState; import android.app.admin.DevicePolicyManager; @@ -227,6 +228,8 @@ public final class SystemServiceRegistry { new ArrayMap, String>(); private static final Map> SYSTEM_SERVICE_FETCHERS = new ArrayMap>(); + private static final Map SYSTEM_SERVICE_CLASS_NAMES = new ArrayMap<>(); + private static int sServiceCacheSize; private static volatile boolean sInitializing; @@ -1389,6 +1392,19 @@ public final class SystemServiceRegistry { @NonNull Class serviceClass, @NonNull ServiceFetcher serviceFetcher) { SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName); SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher); + SYSTEM_SERVICE_CLASS_NAMES.put(serviceName, serviceClass.getSimpleName()); + } + + /** + * Returns system service class name by system service name. This method is mostly an inverse of + * {@link #getSystemServiceName(Class)} + * + * @return system service class name. {@code null} if service name is invalid. + * @hide + */ + @Nullable + public static String getSystemServiceClassName(@NonNull String name) { + return SYSTEM_SERVICE_CLASS_NAMES.get(name); } /**