Skip to content

Commit 40c929e

Browse files
committed
android: Use InternalManagedChannelProvider instead of reflection
This fixes up cda0e9d to be compatible with Proguard without configuration. Since the methods are now accessed directly there is no need for manual -keep configuration.
1 parent 86e3362 commit 40c929e

File tree

2 files changed

+22
-21
lines changed

2 files changed

+22
-21
lines changed

android/src/main/java/io/grpc/android/AndroidChannelBuilder.java

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@
3333
import io.grpc.ConnectivityState;
3434
import io.grpc.ExperimentalApi;
3535
import io.grpc.ForwardingChannelBuilder;
36+
import io.grpc.InternalManagedChannelProvider;
3637
import io.grpc.ManagedChannel;
3738
import io.grpc.ManagedChannelBuilder;
39+
import io.grpc.ManagedChannelProvider;
3840
import io.grpc.MethodDescriptor;
3941
import io.grpc.internal.GrpcUtil;
4042
import java.util.concurrent.TimeUnit;
@@ -55,30 +57,32 @@ public final class AndroidChannelBuilder extends ForwardingChannelBuilder<Androi
5557

5658
private static final String LOG_TAG = "AndroidChannelBuilder";
5759

58-
@Nullable private static final Object OKHTTP_CHANNEL_PROVIDER = findOkHttp();
60+
@Nullable private static final ManagedChannelProvider OKHTTP_CHANNEL_PROVIDER = findOkHttp();
5961

60-
private static Object findOkHttp() {
61-
Class<?> klass;
62+
private static ManagedChannelProvider findOkHttp() {
63+
Class<?> klassRaw;
6264
try {
63-
klass = Class.forName("io.grpc.okhttp.OkHttpChannelProvider");
65+
klassRaw = Class.forName("io.grpc.okhttp.OkHttpChannelProvider");
6466
} catch (ClassNotFoundException e) {
6567
Log.w(LOG_TAG, "Failed to find OkHttpChannelProvider", e);
6668
return null;
6769
}
68-
Object provider;
70+
Class<? extends ManagedChannelProvider> klass;
71+
try {
72+
klass = klassRaw.asSubclass(ManagedChannelProvider.class);
73+
} catch (ClassCastException e) {
74+
Log.w(LOG_TAG, "Couldn't cast OkHttpChannelProvider to ManagedChannelProvider", e);
75+
return null;
76+
}
77+
ManagedChannelProvider provider;
6978
try {
7079
provider = klass.getConstructor().newInstance();
7180
} catch (Exception e) {
7281
Log.w(LOG_TAG, "Failed to construct OkHttpChannelProvider", e);
7382
return null;
7483
}
75-
try {
76-
if (!(Boolean) klass.getMethod("isAvailable").invoke(provider)) {
77-
Log.w(LOG_TAG, "OkHttpChannelProvider.isAvailable() returned false");
78-
return null;
79-
}
80-
} catch (Exception e) {
81-
Log.w(LOG_TAG, "Failed to check OkHttpChannelProvider.isAvailable()", e);
84+
if (!InternalManagedChannelProvider.isAvailable(provider)) {
85+
Log.w(LOG_TAG, "OkHttpChannelProvider.isAvailable() returned false");
8286
return null;
8387
}
8488
return provider;
@@ -135,15 +139,8 @@ private AndroidChannelBuilder(String target) {
135139
if (OKHTTP_CHANNEL_PROVIDER == null) {
136140
throw new UnsupportedOperationException("Unable to load OkHttpChannelProvider");
137141
}
138-
try {
139-
delegateBuilder =
140-
(ManagedChannelBuilder)
141-
OKHTTP_CHANNEL_PROVIDER.getClass()
142-
.getMethod("builderForTarget", String.class)
143-
.invoke(OKHTTP_CHANNEL_PROVIDER, target);
144-
} catch (Exception e) {
145-
throw new RuntimeException("Failed to create ManagedChannelBuilder", e);
146-
}
142+
delegateBuilder =
143+
InternalManagedChannelProvider.builderForTarget(OKHTTP_CHANNEL_PROVIDER, target);
147144
}
148145

149146
private AndroidChannelBuilder(ManagedChannelBuilder<?> delegateBuilder) {

api/src/main/java/io/grpc/InternalManagedChannelProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ public final class InternalManagedChannelProvider {
2525
private InternalManagedChannelProvider() {
2626
}
2727

28+
public static boolean isAvailable(ManagedChannelProvider provider) {
29+
return provider.isAvailable();
30+
}
31+
2832
public static ManagedChannelBuilder<?> builderForAddress(ManagedChannelProvider provider,
2933
String name, int port) {
3034
return provider.builderForAddress(name, port);

0 commit comments

Comments
 (0)