Skip to content

Commit 8207e97

Browse files
arazabishovfacebook-github-bot
authored andcommitted
Android: upgrading to OkHttp from v3 to v4 (#31084)
Summary: Extends #30694 to fix tests. OkHttp v4 was released almost a year ago. Even though v3 is still receiving security and bug fixes, most of the new improvements and features are landing in v4. This PR bumps OkHttp from v3 to v4 and addresses backward-incompatible changes. Side effects of this upgrade: - OkHttp v4 depends on Kotlin's standard library, so react-native will have a transitive dependency on it. - The dex method count of test apk has exceeded the maximum, so multidexing had to be enabled for android tests. ## Changelog <!-- Help reviewers and the release process by writing your own changelog entry. For an example, see: https://github.com/facebook/react-native/wiki/Changelog --> [Android] [Changed] - Bumping OkHttp from v3 to v4. Pull Request resolved: #31084 Test Plan: Automated (relying on the test suite) and manual testing. Reviewed By: fkgozali Differential Revision: D27597430 Pulled By: ShikaSD fbshipit-source-id: 967379b41c2bcd7cfd4083f65059f5da467b8a91
1 parent 0b8731d commit 8207e97

File tree

9 files changed

+147
-40
lines changed

9 files changed

+147
-40
lines changed

ReactAndroid/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ dependencies {
451451
api("com.google.code.findbugs:jsr305:3.0.2")
452452
api("com.squareup.okhttp3:okhttp:${OKHTTP_VERSION}")
453453
api("com.squareup.okhttp3:okhttp-urlconnection:${OKHTTP_VERSION}")
454-
api("com.squareup.okio:okio:1.17.5")
454+
api("com.squareup.okio:okio:2.9.0")
455455
api("com.facebook.fbjni:fbjni-java-only:0.2.2")
456456
extractHeaders("com.facebook.fbjni:fbjni:0.2.2:headers")
457457
extractJNI("com.facebook.fbjni:fbjni:0.2.2")

ReactAndroid/gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ JUNIT_VERSION=4.12
1212

1313
ANDROIDX_TEST_VERSION=1.1.0
1414
FRESCO_VERSION=2.3.0
15-
OKHTTP_VERSION=3.14.9
15+
OKHTTP_VERSION=4.9.0
1616
SO_LOADER_VERSION=0.9.0
1717

1818
BOOST_VERSION=1_63_0

ReactAndroid/src/androidTest/buck-runner/BUCK

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ rn_android_binary(
1111
name = "instrumentation-tests",
1212
keystore = KEYSTORE_TARGET,
1313
manifest = "AndroidManifest.xml",
14+
use_split_dex = True,
1415
deps = [
1516
react_native_dep("libraries/soloader/java/com/facebook/soloader:soloader"),
1617
react_native_dep("third-party/java/testing-support-lib:exposed-instrumentation-api"),

ReactAndroid/src/main/java/com/facebook/react/modules/network/OkHttpClientProvider.java

+1-18
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
import android.content.Context;
1111
import androidx.annotation.Nullable;
1212
import java.io.File;
13-
import java.security.Provider;
14-
import java.security.Security;
1513
import java.util.concurrent.TimeUnit;
1614
import okhttp3.Cache;
1715
import okhttp3.OkHttpClient;
@@ -62,13 +60,7 @@ public static OkHttpClient.Builder createClientBuilder() {
6260
.writeTimeout(0, TimeUnit.MILLISECONDS)
6361
.cookieJar(new ReactCookieJarContainer());
6462

65-
try {
66-
Class ConscryptProvider = Class.forName("org.conscrypt.OpenSSLProvider");
67-
Security.insertProviderAt((Provider) ConscryptProvider.newInstance(), 1);
68-
return client;
69-
} catch (Exception e) {
70-
return enableTls12OnPreLollipop(client);
71-
}
63+
return client;
7264
}
7365

7466
public static OkHttpClient.Builder createClientBuilder(Context context) {
@@ -88,13 +80,4 @@ public static OkHttpClient.Builder createClientBuilder(Context context, int cach
8880

8981
return client.cache(cache);
9082
}
91-
92-
/*
93-
On Android 4.1-4.4 (API level 16 to 19) TLS 1.1 and 1.2 are
94-
available but not enabled by default. The following method
95-
enables it.
96-
*/
97-
public static OkHttpClient.Builder enableTls12OnPreLollipop(OkHttpClient.Builder client) {
98-
return client;
99-
}
10083
}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,46 @@
11
load("//tools/build_defs:fb_native_wrapper.bzl", "fb_native")
2-
load("//tools/build_defs/oss:rn_defs.bzl", "rn_prebuilt_jar")
2+
load("//tools/build_defs/oss:rn_defs.bzl", "react_native_dep", "react_native_target", "rn_android_library", "rn_prebuilt_jar")
33

4-
rn_prebuilt_jar(
4+
rn_android_library(
55
name = "okhttp3",
6-
binary_jar = ":okhttp3-binary.jar",
6+
autoglob = False,
7+
visibility = ["//ReactAndroid/..."],
8+
exported_deps = [
9+
":okhttp3-binary",
10+
react_native_dep("third-party/java/okio:okio"),
11+
# Forces resolver to use OSS Kotlin version
12+
react_native_target("third-party/kotlin:kotlin-stdlib-jdk8"),
13+
],
14+
)
15+
16+
rn_android_library(
17+
name = "okhttp3-urlconnection",
18+
autoglob = False,
719
visibility = ["//ReactAndroid/..."],
20+
exported_deps = [
21+
":okhttp3",
22+
":okhttp3-urlconnection-binary",
23+
],
24+
)
25+
26+
rn_prebuilt_jar(
27+
name = "okhttp3-binary",
28+
binary_jar = ":okhttp3-binary.jar",
829
)
930

1031
fb_native.remote_file(
1132
name = "okhttp3-binary.jar",
12-
sha1 = "3e6d101343c7ea687cd593e4990f73b25c878383",
13-
url = "mvn:com.squareup.okhttp3:okhttp:jar:3.14.9",
33+
sha1 = "08e17601d3bdc8cf57902c154de021931d2c27c1",
34+
url = "mvn:com.squareup.okhttp3:okhttp:jar:4.9.0",
1435
)
1536

1637
rn_prebuilt_jar(
17-
name = "okhttp3-urlconnection",
38+
name = "okhttp3-urlconnection-binary",
1839
binary_jar = ":okhttp3-urlconnection-binary.jar",
19-
visibility = ["//ReactAndroid/..."],
2040
)
2141

2242
fb_native.remote_file(
2343
name = "okhttp3-urlconnection-binary.jar",
24-
sha1 = "c9a3b45b815cf2982415ec8145339f5af58989c3",
25-
url = "mvn:com.squareup.okhttp3:okhttp-urlconnection:jar:3.14.9",
44+
sha1 = "94f82aaabdf53e48d7a1c515bf89ce60dcebfbeb",
45+
url = "mvn:com.squareup.okhttp3:okhttp-urlconnection:jar:4.9.0",
2646
)
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
load("//tools/build_defs:fb_native_wrapper.bzl", "fb_native")
2-
load("//tools/build_defs/oss:rn_defs.bzl", "rn_prebuilt_jar")
2+
load("//tools/build_defs/oss:rn_defs.bzl", "react_native_target", "rn_android_library", "rn_prebuilt_jar")
33

4-
rn_prebuilt_jar(
4+
rn_android_library(
55
name = "okio",
6-
binary_jar = ":okio-binary.jar",
6+
autoglob = False,
77
visibility = ["//ReactAndroid/..."],
8+
exported_deps = [
9+
":okio-binary",
10+
# Forces resolver to use OSS Kotlin version
11+
react_native_target("third-party/kotlin:kotlin-stdlib"),
12+
],
13+
)
14+
15+
rn_prebuilt_jar(
16+
name = "okio-binary",
17+
binary_jar = ":okio-binary.jar",
818
)
919

1020
fb_native.remote_file(
1121
name = "okio-binary.jar",
12-
sha1 = "34336f82f14dde1c0752fd5f0546dbf3c3225aba",
13-
url = "mvn:com.squareup.okio:okio:jar:1.17.5",
22+
sha1 = "0dcc813b08ce5933f8bdfd1dfbab4ad4bd170e7a",
23+
url = "mvn:com.squareup.okio:okio:jar:2.9.0",
1424
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
load("//tools/build_defs:fb_native_wrapper.bzl", "fb_native")
2+
load("//tools/build_defs/oss:rn_defs.bzl", "rn_android_library", "rn_prebuilt_jar")
3+
4+
rn_android_library(
5+
name = "kotlin-stdlib",
6+
visibility = ["PUBLIC"],
7+
exported_deps = [
8+
":jetbrains-annotations",
9+
":kotlin-stdlib-binary",
10+
":kotlin-stdlib-common",
11+
],
12+
)
13+
14+
rn_android_library(
15+
name = "kotlin-stdlib-jdk7",
16+
visibility = ["PUBLIC"],
17+
exported_deps = [
18+
":kotlin-stdlib",
19+
":kotlin-stdlib-jdk7-binary",
20+
],
21+
)
22+
23+
rn_android_library(
24+
name = "kotlin-stdlib-jdk8",
25+
visibility = ["PUBLIC"],
26+
exported_deps = [
27+
":kotlin-stdlib",
28+
":kotlin-stdlib-jdk7",
29+
":kotlin-stdlib-jdk8-binary",
30+
],
31+
)
32+
33+
rn_prebuilt_jar(
34+
name = "jetbrains-annotations",
35+
binary_jar = ":jetbrains-annotations.jar",
36+
visibility = ["//ReactAndroid/..."],
37+
)
38+
39+
fb_native.remote_file(
40+
name = "jetbrains-annotations.jar",
41+
sha1 = "919f0dfe192fb4e063e7dacadee7f8bb9a2672a9",
42+
url = "mvn:org.jetbrains:annotations:jar:13.0",
43+
)
44+
45+
rn_prebuilt_jar(
46+
name = "kotlin-stdlib-binary",
47+
binary_jar = ":kotlin-stdlib-binary.jar",
48+
visibility = ["//ReactAndroid/..."],
49+
)
50+
51+
fb_native.remote_file(
52+
name = "kotlin-stdlib-binary.jar",
53+
sha1 = "ea29e063d2bbe695be13e9d044dcfb0c7add398e",
54+
url = "mvn:org.jetbrains.kotlin:kotlin-stdlib:jar:1.4.10",
55+
)
56+
57+
rn_prebuilt_jar(
58+
name = "kotlin-stdlib-common",
59+
binary_jar = ":kotlin-stdlib-common.jar",
60+
visibility = ["//ReactAndroid/..."],
61+
)
62+
63+
fb_native.remote_file(
64+
name = "kotlin-stdlib-common.jar",
65+
sha1 = "6229be3465805c99db1142ad75e6c6ddeac0b04c",
66+
url = "mvn:org.jetbrains.kotlin:kotlin-stdlib-common:jar:1.4.10",
67+
)
68+
69+
rn_prebuilt_jar(
70+
name = "kotlin-stdlib-jdk7-binary",
71+
binary_jar = ":kotlin-stdlib-jdk7-binary.jar",
72+
visibility = ["//ReactAndroid/..."],
73+
)
74+
75+
fb_native.remote_file(
76+
name = "kotlin-stdlib-jdk7-binary.jar",
77+
sha1 = "30e46450b0bb3dbf43898d2f461be4a942784780",
78+
url = "mvn:org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:1.4.10",
79+
)
80+
81+
rn_prebuilt_jar(
82+
name = "kotlin-stdlib-jdk8-binary",
83+
binary_jar = ":kotlin-stdlib-jdk8-binary.jar",
84+
visibility = ["//ReactAndroid/..."],
85+
)
86+
87+
fb_native.remote_file(
88+
name = "kotlin-stdlib-jdk8-binary.jar",
89+
sha1 = "998caa30623f73223194a8b657abd2baec4880ea",
90+
url = "mvn:org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:1.4.10",
91+
)

ReactAndroid/src/test/java/com/facebook/react/devsupport/JSDebuggerWebSocketClientTest.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import com.facebook.react.common.JavascriptException;
1313
import java.util.HashMap;
14+
import okhttp3.WebSocket;
1415
import okio.ByteString;
1516
import org.junit.Rule;
1617
import org.junit.Test;
@@ -74,7 +75,8 @@ public void test_executeJSCall_ShouldSendCorrectMessage() throws Exception {
7475
public void test_onMessage_WithInvalidContentType_ShouldNotTriggerCallbacks() throws Exception {
7576
JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient());
7677

77-
client.onMessage(null, ByteString.encodeUtf8("{\"replyID\":0, \"result\":\"OK\"}"));
78+
client.onMessage(
79+
mock(WebSocket.class), ByteString.encodeUtf8("{\"replyID\":0, \"result\":\"OK\"}"));
7880
PowerMockito.verifyPrivate(client, never())
7981
.invoke("triggerRequestSuccess", anyInt(), nullable(String.class));
8082
PowerMockito.verifyPrivate(client, never()).invoke("triggerRequestFailure", anyInt(), any());

ReactAndroid/src/test/java/com/facebook/react/modules/network/NetworkingModuleTest.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ public class NetworkingModuleTest {
7676

7777
@Before
7878
public void prepareModules() {
79-
mHttpClient = mock(OkHttpClient.class);
80-
when(mHttpClient.cookieJar()).thenReturn(mock(CookieJarContainer.class));
79+
mHttpClient = PowerMockito.mock(OkHttpClient.class);
80+
PowerMockito.when(mHttpClient.cookieJar()).thenReturn(mock(CookieJarContainer.class));
8181
when(mHttpClient.newCall(any(Request.class)))
8282
.thenAnswer(
8383
new Answer<Object>() {
@@ -87,8 +87,8 @@ public Object answer(InvocationOnMock invocation) throws Throwable {
8787
return callMock;
8888
}
8989
});
90-
OkHttpClient.Builder clientBuilder = mock(OkHttpClient.Builder.class);
91-
when(clientBuilder.build()).thenReturn(mHttpClient);
90+
OkHttpClient.Builder clientBuilder = PowerMockito.mock(OkHttpClient.Builder.class);
91+
PowerMockito.when(clientBuilder.build()).thenReturn(mHttpClient);
9292
when(mHttpClient.newBuilder()).thenReturn(clientBuilder);
9393

9494
mEmitter = mock(RCTDeviceEventEmitter.class);
@@ -453,7 +453,7 @@ public void testMultipartPostRequestBody() throws Exception {
453453
.thenCallRealMethod();
454454
when(inputStream.available()).thenReturn("imageUri".length());
455455

456-
final MultipartBody.Builder multipartBuilder = mock(MultipartBody.Builder.class);
456+
final MultipartBody.Builder multipartBuilder = PowerMockito.mock(MultipartBody.Builder.class);
457457
PowerMockito.whenNew(MultipartBody.Builder.class)
458458
.withNoArguments()
459459
.thenReturn(multipartBuilder);

0 commit comments

Comments
 (0)