Java OkHttp3无法在Android上启动握手
我提出一个简单的请求只是为了检查我是否可以访问互联网:Java OkHttp3无法在Android上启动握手,java,android,kotlin,okhttp,Java,Android,Kotlin,Okhttp,我提出一个简单的请求只是为了检查我是否可以访问互联网: 返回并重试{ val request=request.Builder() .url(“https://www.google.com") .build() val响应=OkHttpClient() .newCall(请求) .execute() response.body()?.close() response.isSuccessful }捕获(e:IOException){ 假的 } 我经常会遇到java.net.SocketTimeou
返回并重试{
val request=request.Builder()
.url(“https://www.google.com")
.build()
val响应=OkHttpClient()
.newCall(请求)
.execute()
response.body()?.close()
response.isSuccessful
}捕获(e:IOException){
假的
}
我经常会遇到java.net.SocketTimeoutException:Read timed out
的catch
块。我发现OkHttp在okhttp3.internal.connection.RealConnection
中没有深入这一行:
private void connectTls(ConnectionSpecSelector ConnectionSpecSelector)引发IOException异常{
// ...
试一试{
// ...
sslSocket.startHandshake();//永远不会转到下一行
// ...
}捕获(断言错误){
//从不到这里来
}最后{
//去这里
}
}
我不知道在sslSocket.startHandshake()
中会发生什么,因为显然sslSocket
是com.android.org.conscrypt.ConscryptEngineSocket
,android并不想让我看到它是如何工作的。
是某种错误还是我做错了什么?是否有修复方法或至少有解决方法
日志:
我使用Android 11(API 30)和OkHttp3 v3.12.0
另外,我记得,我无法将OkHttp更新到更新的版本,因为我有另一个依赖于此特定版本的OkHttp的依赖项,因为更新的版本向后不兼容。似乎您的okhttp3库版本通过反射访问任何内部受限(由新的android版本)类 下面介绍了如何符合要求以及如何为您找到最合适的解决方案: 或者
一个快速的解决办法是将“android构建工具”版本降低到一个尚未实施此类限制的版本。这是一个小黑客,以避免限制新的android版本。但是要小心,因为playmarket不会接受使用太旧的“构建工具”编译的应用程序,所以它不是一个持久的解决方案。您的okhttp3库版本似乎可以通过反射访问任何内部受限(由新的android版本)类 下面介绍了如何符合要求以及如何为您找到最合适的解决方案: 或者
一个快速的解决办法是将“android构建工具”版本降低到一个尚未实施此类限制的版本。这是一个小黑客,以避免限制新的android版本。但是要小心,因为playmarket不会接受使用太旧的“构建工具”编译的应用程序,所以它不是一个持久的解决方案。升级到OkHttp3 v3.12.12,这已经修复
请参阅升级到OkHttp3 v3.12.12,此问题已修复
请参见它在android 10、9或8上运行?
buildToolsVersion'29.0.3'
,因此它也应该在android 10上运行,但在我写这个问题几个小时后,它甚至停止在android 11上复制。猜猜,这次它没去那里。现在我没有时间尝试解决这个问题,但我可能会稍后再讨论。它在Android 10上不起作用,但在Android 7上起作用。然后检查我的答案,如果您需要快速解决方案,请尝试将buildtools版本降低到Android 7 CurrentCompiledkVersion
is29
,因此,如果我想将buildToolsVersion
更改为较旧的版本,如28.0.3
,我也需要将compileSdkVersion
更改为28
。这有点问题。它在android 10、9或8上运行?buildToolsVersion'29.0.3'
,所以它也应该在android 10上运行,但在我写这个问题几个小时后,它甚至停止在android 11上复制。猜猜,这次它没去那里。现在我没有时间尝试解决这个问题,但我可能会稍后再讨论。它在Android 10上不起作用,但在Android 7上起作用。然后检查我的答案,如果您需要快速解决方案,请尝试将buildtools版本降低到Android 7 CurrentCompiledkVersion
is29
,因此,如果我想将buildToolsVersion
更改为较旧的版本,如28.0.3
,我也需要将compileSdkVersion
更改为28
。这有点问题。不幸的是,我无法更新到3.13.0
,并且3.12.12
无法解决此问题。不过,它不再记录这些反射错误。不幸的是,我无法更新到3.13.0
,而3.12.12
也无法解决此问题。不过,它不再记录这些反射错误。
Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setUseSessionTickets(Z)V (blacklist,core-platform-api, reflection, denied)
Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setHostname(Ljava/lang/String;)V (blacklist,core-platform-api, reflection, denied)
Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setUseSessionTickets(Z)V (blacklist,core-platform-api, reflection, denied)
Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setHostname(Ljava/lang/String;)V (blacklist,core-platform-api, reflection, denied)
Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setUseSessionTickets(Z)V (blacklist,core-platform-api, reflection, denied)
Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setHostname(Ljava/lang/String;)V (blacklist,core-platform-api, reflection, denied)
Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setUseSessionTickets(Z)V (blacklist,core-platform-api, reflection, denied)
Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setHostname(Ljava/lang/String;)V (blacklist,core-platform-api, reflection, denied)
Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setUseSessionTickets(Z)V (blacklist,core-platform-api, reflection, denied)
Accessing hidden method Lcom/android/org/conscrypt/ConscryptEngineSocket;->setHostname(Ljava/lang/String;)V (blacklist,core-platform-api, reflection, denied)