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
This commit is contained in:
Makoto Onuki
2020-02-18 12:38:21 -08:00
parent 08b20c4b0b
commit 2cddb8a891

View File

@@ -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<Class<?>, 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;
}