java.lang.AbstractMethodError: abstract method "okio.Timeout okhttp3.Call.timeout()"

java.lang.AbstractMethodError: abstract method "okio.Timeout okhttp3.Call.timeout()"

当我们将 React Native 从 0.57.8 升级到 0.58.6 时,我们在 android

上遇到了问题

我们找不到找不到实现的根本原因。

谢谢。

android工作室的日志如下:

V/StudioProfiler:已转换 class:okhttp3/OkHttpClient W/xxxxx: 当前dex文件中有多个class。如果没有对其应用转换,则在此 class 上调用 RetransformClasses 可能会失败! D/NetworkSecurityConfig:未指定网络安全配置,使用平台默认设置 W/gov.nsw.servic: 访问隐藏方法 Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setUseSessionTickets(Z)V (light greylist, reflection) W/gov.nsw.servic: 访问隐藏方法Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setHostname(Ljava/lang/String;)V(浅灰名单,反射) 访问隐藏方法 Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getAlpnSelectedProtocol()[B (light greylist, reflection) 访问隐藏方法 Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([B)V (light greylist, reflection) 访问隐藏方法 Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard; (浅灰名单,反射) 访问隐藏方法Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V(浅灰名单,反射) 访问隐藏方法 Ldalvik/system/CloseGuard;->warnIfOpen()V (light greylist, reflection) D/ReactNative: ReactInstanceManager.createReactContextInBackground() ReactInstanceManager.recreateReactContextInBackgroundInner() E/AndroidRuntime:致命异常:AsyncTask #2 过程:xxxx,PID:8127 java.lang.RuntimeException: 执行 doInBackground() 时出错 在 android.os.AsyncTask$3.done(AsyncTask.java:354) 在 java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:252) 在 java.util.concurrent.FutureTask.run(FutureTask.java:271) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:764) 原因:java.lang.AbstractMethodError:抽象方法"okio.Timeout okhttp3.Call.timeout()" 在 okhttp3.internal.ws.RealWebSocket.connect(RealWebSocket.java:190) 在 okhttp3.OkHttpClient.newWebSocket(OkHttpClient.java:442) 在 com.facebook.react.devsupport.InspectorPackagerConnection$Connection.connect(InspectorPackagerConnection.java:251) 在 com.facebook.react.devsupport.InspectorPackagerConnection.connect(InspectorPackagerConnection.java:52) 在 com.facebook.react.devsupport.DevServerHelper$3.doInBackground(DevServerHelper.java:230) 在 com.facebook.react.devsupport.DevServerHelper$3.doInBackground(DevServerHelper.java:222) 在 android.os.AsyncTask$2.call(AsyncTask.java:333) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:764) E/AndroidRuntime:致命异常:AsyncTask #1 过程:xxxxx,PID:8127 java.lang.RuntimeException: 执行 doInBackground() 时出错 在 android.os.AsyncTask$3.done(AsyncTask.java:354) 在 java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:252) 在 java.util.concurrent.FutureTask.run(FutureTask.java:271) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:764) 原因:java.lang.AbstractMethodError:抽象方法"okio.Timeout okhttp3.Call.timeout()" 在 okhttp3.internal.ws.RealWebSocket.connect(RealWebSocket.java:190) 在 okhttp3.OkHttpClient.newWebSocket(OkHttpClient.java:442) 在 com.facebook.react.packagerconnection.ReconnectingWebSocket.connect(ReconnectingWebSocket.java:77) 在 com.facebook.react.packagerconnection.JSPackagerClient.init(JSPackagerClient.java:89) 在 com.facebook.react.devsupport.DevServerHelper$1.doInBackground(DevServerHelper.java:197) 在 com.facebook.react.devsupport.DevServerHelper$1.doInBackground(DevServerHelper.java:151) 在 android.os.AsyncTask$2.call(AsyncTask.java:333) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:764) I/Process:发送信号。 PID:8127 SIG:9 W/.0.2.2:8081/...: type=1400 audit(0.0:777): avc: denied { write } for name="perfd" dev="dm-0" ino=65541 scontext=u :r:untrusted_app_27:s0:c512,c768 tcontext=u:object_r:shell_data_file:s0 tclass=dir permissive=0 type=1400 audit(0.0:778): avc: denied { write } for name="perfd" dev="dm-0" ino=65541 scontext=u:r:untrusted_app_27:s0:c512, c768 tcontext=u:object_r:shell_data_file:s0 tclass=dir permissive=0 与目标 VM 断开连接,地址:'localhost:8673',传输:'socket'

经过一些研究调查这个问题后,我发现:

显然,此崩溃是由于在创建 React Native 应用程序实例时 React Native 包使用 okhttp3 时出现超时错误引起的。

深入研究这个日志,我发现 okhttp3 仓库中的 RealWebSocket.java:192 文件引入了一个清除超时的更改,这个更改与 React lib 中的一些 类 混淆packager 连接包并因此产生崩溃。

请注意,此更改是在 okhttp 版本 3.12.0 提交 04a74b2 中引入的。这意味着低于此版本的任何版本都与 React lib 完全兼容。

此外,我还发现在最近的 okhttp 版本 3.14.0 提交 e6cfc2a 中恢复了与 React lib 和 okhttp 的稳定交互

我建议您不要使用 okhttp 3.12.0,而是遵循您的 okhttp 实施的下一个标准:

3.11.0>= okhttp >=3.14.0

在那之后,您的应用程序应该运行起来非常棒。

PS。如果您的 Gradle 文件中有其他需要使用 okhttp 1.12.0 的依赖项(就像我的情况),请从它们中排除此库。