summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorMakoto Onuki <omakoto@google.com>2020-02-18 12:38:21 -0800
committerMakoto Onuki <omakoto@google.com>2020-04-01 17:27:58 -0700
commita455e5e28160e29d76b84278e28bdd7cb14f538b (patch)
treefebd7a818abbedd7d3eddc83d02170835906e5c3 /core/java/android
parentc068acb6aeb3d86226f8eaccad7ddee8d4dfd8db (diff)
Add WTF when a system server wrapper can't be found
2nd try -- enable it only within the system server. This is to detect someone trying to access system services too early during a boot. Bug: 149406139 Test: Boot with "adb logcat | grep -w SystemServiceRegistry" and make sure no wtf is logged Change-Id: I64c6776cedaeb534d98621db2955d585e6846b8d
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/app/SystemServiceRegistry.java44
1 files changed, 40 insertions, 4 deletions
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 054e5e0945f3..91a857225324 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -186,6 +186,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;
@@ -222,6 +223,9 @@ import java.util.Objects;
public final class SystemServiceRegistry {
private static final String TAG = "SystemServiceRegistry";
+ /** @hide */
+ public static boolean sEnableServiceNotFoundWtf = false;
+
// Service registry information.
// This information is never changed once static initialization has completed.
private static final Map<Class<?>, String> SYSTEM_SERVICE_NAMES =
@@ -1364,8 +1368,30 @@ 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 (fetcher == null) {
+ if (sEnableServiceNotFoundWtf) {
+ Slog.wtf(TAG, "Unknown manager requested: " + name);
+ }
+ return null;
+ }
+
+ final Object ret = fetcher.getService(ctx);
+ if (sEnableServiceNotFoundWtf && 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;
}
/**
@@ -1373,7 +1399,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 (sEnableServiceNotFoundWtf && serviceName == null) {
+ // This should be a caller bug.
+ Slog.wtf(TAG, "Unknown manager requested: " + serviceClass.getCanonicalName());
+ }
+ return serviceName;
}
/**
@@ -1683,7 +1717,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;
}