diff --git a/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java b/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java index dadab1c830c9..6da80fa77111 100644 --- a/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java +++ b/android/src/main/java/io/grpc/android/AndroidChannelBuilder.java @@ -55,14 +55,33 @@ public final class AndroidChannelBuilder extends ForwardingChannelBuilder OKHTTP_CHANNEL_BUILDER_CLASS = findOkHttp(); + @Nullable private static final Object OKHTTP_CHANNEL_PROVIDER = findOkHttp(); - private static Class findOkHttp() { + private static Object findOkHttp() { + Class klass; try { - return Class.forName("io.grpc.okhttp.OkHttpChannelBuilder"); + klass = Class.forName("io.grpc.okhttp.OkHttpChannelProvider"); } catch (ClassNotFoundException e) { + Log.w(LOG_TAG, "Failed to find OkHttpChannelProvider", e); return null; } + Object provider; + try { + provider = klass.getConstructor().newInstance(); + } catch (Exception e) { + Log.w(LOG_TAG, "Failed constructing OkHttpChannelProvider", e); + return null; + } + try { + if (!(Boolean) klass.getMethod("isAvailable").invoke(provider)) { + Log.w(LOG_TAG, "OkHttpChannelProvider.isAvailable() returned false"); + return null; + } + } catch (Exception e) { + Log.w(LOG_TAG, "Failed checking OkHttpChannelProvider.isAvailable()", e); + return null; + } + return provider; } private final ManagedChannelBuilder delegateBuilder; @@ -113,15 +132,15 @@ public static AndroidChannelBuilder usingBuilder(ManagedChannelBuilder builde } private AndroidChannelBuilder(String target) { - if (OKHTTP_CHANNEL_BUILDER_CLASS == null) { - throw new UnsupportedOperationException("No ManagedChannelBuilder found on the classpath"); + if (OKHTTP_CHANNEL_PROVIDER == null) { + throw new UnsupportedOperationException("Unable to load OkHttpChannelProvider"); } try { delegateBuilder = (ManagedChannelBuilder) - OKHTTP_CHANNEL_BUILDER_CLASS - .getMethod("forTarget", String.class) - .invoke(null, target); + OKHTTP_CHANNEL_PROVIDER.getClass() + .getMethod("builderForTarget", String.class) + .invoke(OKHTTP_CHANNEL_PROVIDER, target); } catch (Exception e) { throw new RuntimeException("Failed to create ManagedChannelBuilder", e); }