cronet: Update Cronet to latest release + Move to Stable Cronet APIs.

This commit is contained in:
Ashok Varma 2024-04-03 06:15:31 -07:00 committed by Terry Wilson
parent 9de8e44384
commit 5a8da19f32
5 changed files with 20 additions and 130 deletions

View File

@ -20,7 +20,6 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static io.grpc.internal.GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE; import static io.grpc.internal.GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE;
import android.util.Log;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
@ -38,8 +37,6 @@ import io.grpc.internal.ManagedChannelImplBuilder;
import io.grpc.internal.ManagedChannelImplBuilder.ClientTransportFactoryBuilder; import io.grpc.internal.ManagedChannelImplBuilder.ClientTransportFactoryBuilder;
import io.grpc.internal.SharedResourceHolder; import io.grpc.internal.SharedResourceHolder;
import io.grpc.internal.TransportTracer; import io.grpc.internal.TransportTracer;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.SocketAddress; import java.net.SocketAddress;
import java.util.Collection; import java.util.Collection;
@ -49,15 +46,11 @@ import java.util.concurrent.ScheduledExecutorService;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.chromium.net.BidirectionalStream; import org.chromium.net.BidirectionalStream;
import org.chromium.net.CronetEngine; import org.chromium.net.CronetEngine;
import org.chromium.net.ExperimentalBidirectionalStream;
import org.chromium.net.ExperimentalCronetEngine;
/** Convenience class for building channels with the cronet transport. */ /** Convenience class for building channels with the cronet transport. */
@ExperimentalApi("There is no plan to make this API stable, given transport API instability") @ExperimentalApi("There is no plan to make this API stable, given transport API instability")
public final class CronetChannelBuilder extends ForwardingChannelBuilder2<CronetChannelBuilder> { public final class CronetChannelBuilder extends ForwardingChannelBuilder2<CronetChannelBuilder> {
private static final String LOG_TAG = "CronetChannelBuilder";
/** BidirectionalStream.Builder factory used for getting the gRPC BidirectionalStream. */ /** BidirectionalStream.Builder factory used for getting the gRPC BidirectionalStream. */
public static abstract class StreamBuilderFactory { public static abstract class StreamBuilderFactory {
public abstract BidirectionalStream.Builder newBidirectionalStreamBuilder( public abstract BidirectionalStream.Builder newBidirectionalStreamBuilder(
@ -296,11 +289,6 @@ public final class CronetChannelBuilder extends ForwardingChannelBuilder2<Cronet
* StreamBuilderFactory impl that applies TrafficStats tags to stream builders that are produced. * StreamBuilderFactory impl that applies TrafficStats tags to stream builders that are produced.
*/ */
private static class TaggingStreamFactory extends StreamBuilderFactory { private static class TaggingStreamFactory extends StreamBuilderFactory {
private static volatile boolean loadSetTrafficStatsTagAttempted;
private static volatile boolean loadSetTrafficStatsUidAttempted;
private static volatile Method setTrafficStatsTagMethod;
private static volatile Method setTrafficStatsUidMethod;
private final CronetEngine cronetEngine; private final CronetEngine cronetEngine;
private final boolean trafficStatsTagSet; private final boolean trafficStatsTagSet;
private final int trafficStatsTag; private final int trafficStatsTag;
@ -323,74 +311,16 @@ public final class CronetChannelBuilder extends ForwardingChannelBuilder2<Cronet
@Override @Override
public BidirectionalStream.Builder newBidirectionalStreamBuilder( public BidirectionalStream.Builder newBidirectionalStreamBuilder(
String url, BidirectionalStream.Callback callback, Executor executor) { String url, BidirectionalStream.Callback callback, Executor executor) {
ExperimentalBidirectionalStream.Builder builder = BidirectionalStream.Builder builder =
((ExperimentalCronetEngine) cronetEngine) cronetEngine
.newBidirectionalStreamBuilder(url, callback, executor); .newBidirectionalStreamBuilder(url, callback, executor);
if (trafficStatsTagSet) { if (trafficStatsTagSet) {
setTrafficStatsTag(builder, trafficStatsTag); builder.setTrafficStatsTag(trafficStatsTag);
} }
if (trafficStatsUidSet) { if (trafficStatsUidSet) {
setTrafficStatsUid(builder, trafficStatsUid); builder.setTrafficStatsUid(trafficStatsUid);
} }
return builder; return builder;
} }
private static void setTrafficStatsTag(ExperimentalBidirectionalStream.Builder builder,
int tag) {
if (!loadSetTrafficStatsTagAttempted) {
synchronized (TaggingStreamFactory.class) {
if (!loadSetTrafficStatsTagAttempted) {
try {
setTrafficStatsTagMethod = ExperimentalBidirectionalStream.Builder.class
.getMethod("setTrafficStatsTag", int.class);
} catch (NoSuchMethodException e) {
Log.w(LOG_TAG,
"Failed to load method ExperimentalBidirectionalStream.Builder.setTrafficStatsTag",
e);
} finally {
loadSetTrafficStatsTagAttempted = true;
}
}
}
}
if (setTrafficStatsTagMethod != null) {
try {
setTrafficStatsTagMethod.invoke(builder, tag);
} catch (InvocationTargetException e) {
throw new RuntimeException(e.getCause() == null ? e.getTargetException() : e.getCause());
} catch (IllegalAccessException e) {
Log.w(LOG_TAG, "Failed to set traffic stats tag: " + tag, e);
}
}
}
private static void setTrafficStatsUid(ExperimentalBidirectionalStream.Builder builder,
int uid) {
if (!loadSetTrafficStatsUidAttempted) {
synchronized (TaggingStreamFactory.class) {
if (!loadSetTrafficStatsUidAttempted) {
try {
setTrafficStatsUidMethod = ExperimentalBidirectionalStream.Builder.class
.getMethod("setTrafficStatsUid", int.class);
} catch (NoSuchMethodException e) {
Log.w(LOG_TAG,
"Failed to load method ExperimentalBidirectionalStream.Builder.setTrafficStatsUid",
e);
} finally {
loadSetTrafficStatsUidAttempted = true;
}
}
}
}
if (setTrafficStatsUidMethod != null) {
try {
setTrafficStatsUidMethod.invoke(builder, uid);
} catch (InvocationTargetException e) {
throw new RuntimeException(e.getCause() == null ? e.getTargetException() : e.getCause());
} catch (IllegalAccessException e) {
Log.w(LOG_TAG, "Failed to set traffic stats uid: " + uid, e);
}
}
}
} }
} }

View File

@ -40,8 +40,6 @@ import io.grpc.internal.StatsTraceContext;
import io.grpc.internal.TransportFrameUtil; import io.grpc.internal.TransportFrameUtil;
import io.grpc.internal.TransportTracer; import io.grpc.internal.TransportTracer;
import io.grpc.internal.WritableBuffer; import io.grpc.internal.WritableBuffer;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.Buffer; import java.nio.Buffer;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.Charset; import java.nio.charset.Charset;
@ -55,7 +53,6 @@ import javax.annotation.Nullable;
import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.GuardedBy;
import org.chromium.net.BidirectionalStream; import org.chromium.net.BidirectionalStream;
import org.chromium.net.CronetException; import org.chromium.net.CronetException;
import org.chromium.net.ExperimentalBidirectionalStream;
import org.chromium.net.UrlResponseInfo; import org.chromium.net.UrlResponseInfo;
/** /**
@ -66,9 +63,6 @@ class CronetClientStream extends AbstractClientStream {
private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocateDirect(0); private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocateDirect(0);
private static final String LOG_TAG = "grpc-java-cronet"; private static final String LOG_TAG = "grpc-java-cronet";
private static volatile boolean loadAddRequestAnnotationAttempted;
private static volatile Method addRequestAnnotationMethod;
@Deprecated @Deprecated
static final CallOptions.Key<Object> CRONET_ANNOTATION_KEY = static final CallOptions.Key<Object> CRONET_ANNOTATION_KEY =
CallOptions.Key.create("cronet-annotation"); CallOptions.Key.create("cronet-annotation");
@ -194,14 +188,12 @@ class CronetClientStream extends AbstractClientStream {
builder.delayRequestHeadersUntilFirstFlush(true); builder.delayRequestHeadersUntilFirstFlush(true);
} }
if (annotation != null || annotations != null) { if (annotation != null || annotations != null) {
ExperimentalBidirectionalStream.Builder expBidiStreamBuilder =
(ExperimentalBidirectionalStream.Builder) builder;
if (annotation != null) { if (annotation != null) {
addRequestAnnotation(expBidiStreamBuilder, annotation); builder.addRequestAnnotation(annotation);
} }
if (annotations != null) { if (annotations != null) {
for (Object o : annotations) { for (Object o : annotations) {
addRequestAnnotation(expBidiStreamBuilder, o); builder.addRequestAnnotation(o);
} }
} }
} }
@ -367,35 +359,6 @@ class CronetClientStream extends AbstractClientStream {
&& !TE_HEADER.name().equalsIgnoreCase(key); && !TE_HEADER.name().equalsIgnoreCase(key);
} }
private static void addRequestAnnotation(ExperimentalBidirectionalStream.Builder builder,
Object annotation) {
if (!loadAddRequestAnnotationAttempted) {
synchronized (CronetClientStream.class) {
if (!loadAddRequestAnnotationAttempted) {
try {
addRequestAnnotationMethod = ExperimentalBidirectionalStream.Builder.class
.getMethod("addRequestAnnotation", Object.class);
} catch (NoSuchMethodException e) {
Log.w(LOG_TAG,
"Failed to load method ExperimentalBidirectionalStream.Builder.addRequestAnnotation",
e);
} finally {
loadAddRequestAnnotationAttempted = true;
}
}
}
}
if (addRequestAnnotationMethod != null) {
try {
addRequestAnnotationMethod.invoke(builder, annotation);
} catch (InvocationTargetException e) {
throw new RuntimeException(e.getCause() == null ? e.getTargetException() : e.getCause());
} catch (IllegalAccessException e) {
Log.w(LOG_TAG, "Failed to add request annotation: " + annotation, e);
}
}
}
private void setGrpcHeaders(BidirectionalStream.Builder builder) { private void setGrpcHeaders(BidirectionalStream.Builder builder) {
// Psuedo-headers are set by cronet. // Psuedo-headers are set by cronet.
// All non-pseudo headers must come after pseudo headers. // All non-pseudo headers must come after pseudo headers.

View File

@ -35,7 +35,7 @@ import io.grpc.internal.SharedResourceHolder;
import io.grpc.testing.TestMethodDescriptors; import io.grpc.testing.TestMethodDescriptors;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import org.chromium.net.ExperimentalCronetEngine; import org.chromium.net.CronetEngine;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -50,7 +50,7 @@ import org.robolectric.annotation.Config;
public final class CronetChannelBuilderTest { public final class CronetChannelBuilderTest {
@Rule public final MockitoRule mocks = MockitoJUnit.rule(); @Rule public final MockitoRule mocks = MockitoJUnit.rule();
@Mock private ExperimentalCronetEngine mockEngine; @Mock private CronetEngine mockEngine;
@Mock private ChannelLogger channelLogger; @Mock private ChannelLogger channelLogger;
private final ClientStreamTracer[] tracers = private final ClientStreamTracer[] tracers =

View File

@ -54,7 +54,6 @@ import java.util.Map;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import org.chromium.net.BidirectionalStream; import org.chromium.net.BidirectionalStream;
import org.chromium.net.CronetException; import org.chromium.net.CronetException;
import org.chromium.net.ExperimentalBidirectionalStream;
import org.chromium.net.UrlResponseInfo; import org.chromium.net.UrlResponseInfo;
import org.chromium.net.impl.UrlResponseInfoImpl; import org.chromium.net.impl.UrlResponseInfoImpl;
import org.junit.Before; import org.junit.Before;
@ -76,9 +75,9 @@ public final class CronetClientStreamTest {
@Mock private CronetClientTransport transport; @Mock private CronetClientTransport transport;
private Metadata metadata = new Metadata(); private Metadata metadata = new Metadata();
@Mock private StreamBuilderFactory factory; @Mock private StreamBuilderFactory factory;
@Mock private ExperimentalBidirectionalStream cronetStream; @Mock private BidirectionalStream cronetStream;
@Mock private ClientStreamListener clientListener; @Mock private ClientStreamListener clientListener;
@Mock private ExperimentalBidirectionalStream.Builder builder; @Mock private BidirectionalStream.Builder builder;
private final Object lock = new Object(); private final Object lock = new Object();
private final TransportTracer transportTracer = TransportTracer.getDefaultFactory().create(); private final TransportTracer transportTracer = TransportTracer.getDefaultFactory().create();
private final Executor executor = new Executor() { private final Executor executor = new Executor() {
@ -681,8 +680,8 @@ public final class CronetClientStreamTest {
true, true,
false); false);
callback.setStream(stream); callback.setStream(stream);
ExperimentalBidirectionalStream.Builder getBuilder = BidirectionalStream.Builder getBuilder =
mock(ExperimentalBidirectionalStream.Builder.class); mock(BidirectionalStream.Builder.class);
when(getFactory.newBidirectionalStreamBuilder( when(getFactory.newBidirectionalStreamBuilder(
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class))) any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
.thenReturn(getBuilder); .thenReturn(getBuilder);
@ -738,8 +737,8 @@ public final class CronetClientStreamTest {
true, true,
true); true);
callback.setStream(stream); callback.setStream(stream);
ExperimentalBidirectionalStream.Builder builder = BidirectionalStream.Builder builder =
mock(ExperimentalBidirectionalStream.Builder.class); mock(BidirectionalStream.Builder.class);
when(factory.newBidirectionalStreamBuilder( when(factory.newBidirectionalStreamBuilder(
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class))) any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
.thenReturn(builder); .thenReturn(builder);
@ -770,8 +769,8 @@ public final class CronetClientStreamTest {
true, true,
true); true);
callback.setStream(stream); callback.setStream(stream);
ExperimentalBidirectionalStream.Builder builder = BidirectionalStream.Builder builder =
mock(ExperimentalBidirectionalStream.Builder.class); mock(BidirectionalStream.Builder.class);
when(factory.newBidirectionalStreamBuilder( when(factory.newBidirectionalStreamBuilder(
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class))) any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
.thenReturn(builder); .thenReturn(builder);
@ -810,8 +809,8 @@ public final class CronetClientStreamTest {
false, false,
false); false);
callback.setStream(stream); callback.setStream(stream);
ExperimentalBidirectionalStream.Builder builder = BidirectionalStream.Builder builder =
mock(ExperimentalBidirectionalStream.Builder.class); mock(BidirectionalStream.Builder.class);
when(factory.newBidirectionalStreamBuilder( when(factory.newBidirectionalStreamBuilder(
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class))) any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
.thenReturn(builder); .thenReturn(builder);

View File

@ -23,10 +23,8 @@ auto-value-annotations = "com.google.auto.value:auto-value-annotations:1.10.4"
checkstyle = "com.puppycrawl.tools:checkstyle:10.12.5" checkstyle = "com.puppycrawl.tools:checkstyle:10.12.5"
commons-math3 = "org.apache.commons:commons-math3:3.6.1" commons-math3 = "org.apache.commons:commons-math3:3.6.1"
conscrypt = "org.conscrypt:conscrypt-openjdk-uber:2.5.2" conscrypt = "org.conscrypt:conscrypt-openjdk-uber:2.5.2"
# Update notes / 2023-07-19 sergiitk: cronet-api = "org.chromium.net:cronet-api:119.6045.31"
# Cronet (API and Embedded) upgrade is blocked by https://github.com/grpc/grpc-java/issues/10396. cronet-embedded = "org.chromium.net:cronet-embedded:119.6045.31"
cronet-api = "org.chromium.net:cronet-api:108.5359.79"
cronet-embedded = "org.chromium.net:cronet-embedded:108.5359.79"
errorprone-annotations = "com.google.errorprone:error_prone_annotations:2.23.0" errorprone-annotations = "com.google.errorprone:error_prone_annotations:2.23.0"
errorprone-core = "com.google.errorprone:error_prone_core:2.23.0" errorprone-core = "com.google.errorprone:error_prone_core:2.23.0"
google-api-protos = "com.google.api.grpc:proto-google-common-protos:2.29.0" google-api-protos = "com.google.api.grpc:proto-google-common-protos:2.29.0"