From 2cddb8a8913aa1f5367bd590c123f93c597424b5 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Tue, 18 Feb 2020 12:38:21 -0800 Subject: [PATCH] Add WTF when a system server wrapper can't be found Context.getSystemService() shouldn't return null, but sometimes we observer it. Add WTFs to investigate it. Bug: 149406139 Test: Boot with "adb logcat | grep -i wtf" and make sure no wtf is logged Change-Id: I64c6776cedaeb534d98621db2955d585e6846b8d --- .../android/app/SystemServiceRegistry.java | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 50b9d6b47e020..8570c6b5ff48d 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -183,6 +183,7 @@ import android.telephony.TelephonyFrameworkInitializer; import android.telephony.TelephonyRegistryManager; import android.util.ArrayMap; import android.util.Log; +import android.util.Slog; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.WindowManager; @@ -219,6 +220,8 @@ import java.util.Objects; public final class SystemServiceRegistry { private static final String TAG = "SystemServiceRegistry"; + private static final boolean ENABLE_SERVICE_NOT_FOUND_WTF = true; + // Service registry information. // This information is never changed once static initialization has completed. private static final Map, String> SYSTEM_SERVICE_NAMES = @@ -1357,8 +1360,29 @@ public final class SystemServiceRegistry { * @hide */ public static Object getSystemService(ContextImpl ctx, String name) { - ServiceFetcher fetcher = SYSTEM_SERVICE_FETCHERS.get(name); - return fetcher != null ? fetcher.getService(ctx) : null; + if (name == null) { + return null; + } + final ServiceFetcher fetcher = SYSTEM_SERVICE_FETCHERS.get(name); + if (ENABLE_SERVICE_NOT_FOUND_WTF && fetcher == null) { + // This should be a caller bug. + Slog.wtf(TAG, "Unknown manager requested: " + name); + return null; + } + + final Object ret = fetcher.getService(ctx); + if (ENABLE_SERVICE_NOT_FOUND_WTF && ret == null) { + // Some services do return null in certain situations, so don't do WTF for them. + switch (name) { + case Context.CONTENT_CAPTURE_MANAGER_SERVICE: + case Context.APP_PREDICTION_SERVICE: + case Context.INCREMENTAL_SERVICE: + return null; + } + Slog.wtf(TAG, "Manager wrapper not available: " + name); + return null; + } + return ret; } /** @@ -1366,7 +1390,15 @@ public final class SystemServiceRegistry { * @hide */ public static String getSystemServiceName(Class serviceClass) { - return SYSTEM_SERVICE_NAMES.get(serviceClass); + if (serviceClass == null) { + return null; + } + final String serviceName = SYSTEM_SERVICE_NAMES.get(serviceClass); + if (ENABLE_SERVICE_NOT_FOUND_WTF && serviceName == null) { + // This should be a caller bug. + Slog.wtf(TAG, "Unknown manager requested: " + serviceClass.getCanonicalName()); + } + return serviceName; } /** @@ -1663,7 +1695,9 @@ public final class SystemServiceRegistry { try { cache.wait(); } catch (InterruptedException e) { - Log.w(TAG, "getService() interrupted"); + // This shouldn't normally happen, but if someone interrupts the + // thread, it will. + Slog.wtf(TAG, "getService() interrupted"); Thread.currentThread().interrupt(); return null; }