【问题标题】:java.lang.AbstractMethodError: abstract method "okio.Timeout okhttp3.Call.timeout()"java.lang.AbstractMethodError:抽象方法“okio.Timeout okhttp3.Call.timeout()”
【发布时间】:2019-03-14 21:49:56
【问题描述】:

当我们将 react native 从 0.57.8 升级到 0.58.6 时,我们在 android 上遇到了问题

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

谢谢。

来自android studio的日志如下:

V/StudioProfiler:转换类:okhttp3/OkHttpClient W/xxxxx:当前的 dex 文件中有多个类。如果没有对其应用任何转换,则对此类调用 RetransformClasses 可能会失败! D/NetworkSecurityConfig:未指定网络安全配置,使用平台默认值 W/gov.nsw.servic:访问隐藏方法 Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setUseSessionTickets(Z)V(浅灰名单,反射) W/gov.nsw.servic:访问隐藏方法 Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setHostname(Ljava/lang/String;)V(浅灰名单,反射) 访问隐藏方法 Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getAlpnSelectedProtocol()[B(浅灰名单,反射) 访问隐藏方法 Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([B)V(浅灰名单,反射) 访问隐藏方法 Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard; (浅灰名单,反射) 访问隐藏方法 Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V(浅灰名单,反射) 访问隐藏方法 Ldalvik/system/CloseGuard;->warnIfOpen()V(浅灰名单,反射) 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 审核(0.0:778):avc:拒绝 { 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=目录许可=0 与目标VM断开连接,地址:'localhost:8673',传输:'socket'

【问题讨论】:

  • 我正在处理一个类似的问题,您的 Android 应用实施的是哪个版本的 okhttp?
  • okhttp 版本是 3.12.1,也就是 react native 0.58.6 中的版本

标签: react-native-android okhttp3


【解决方案1】:

在对调查此问题进行一些研究后,我发现:

显然,这个崩溃是由于React Native包在创建React Native应用程序实例时使用okhttp3时超时错误造成的。

深入挖掘这个日志,我发现 okhttp3 repo 中的 RealWebSocket.java:192 文件,引入了一个清除超时的更改,这个更改与 React lib packager Connection 包中的一些类混淆,因此产生了崩溃.

请注意,此更改是在 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(在我的情况下),请从它们中排除此库。

【讨论】:

  • 您的解决方案有效。非常感谢!但我仍然有一个问题,为什么只有我们遇到了这个问题。如果它是由 react-native 中的依赖引起的,这应该是一个流行的问题
猜你喜欢
  • 2020-10-28
  • 2017-04-22
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多