[英]OkHttp3 cannot start handshake on Android
我提出一个简单的请求,只是为了检查我是否可以访问 Internet:
return try {
val request = Request.Builder()
.url("https://www.google.com")
.build()
val response = OkHttpClient()
.newCall(request)
.execute()
response.body()?.close()
response.isSuccessful
} catch (e: IOException) {
false
}
我经常陷入java.net.SocketTimeoutException: Read timed out
的catch
块。 我发现 OkHttp 在okhttp3.internal.connection.RealConnection
中没有 go 进一步这一行:
private void connectTls(ConnectionSpecSelector connectionSpecSelector) throws IOException {
// ...
try {
// ...
sslSocket.startHandshake(); // never goes to the next line
// ...
} catch(AssertionError e) {
// never goes here
} finally {
// goes here
}
}
我无法弄清楚sslSocket.startHandshake()
中发生了什么,因为显然sslSocket
是com.android.org.conscrypt.ConscryptEngineSocket
和 ZE84E30B9390CDB64DB6DB2C9AB878 是某种错误还是我做错了什么? 是否有修复或至少有解决方法?
日志:
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)
我使用 Android 11 (API 30) 和 OkHttp3 v3.12.0。
PS 我记得,我不能将 OkHttp 更新为更新的东西,因为我有另一个依赖于这个特定版本的 OkHttp 的依赖项,因为更新的版本是向后不兼容的。
似乎您的 okhttp3 库版本通过反射访问任何内部限制(由新的 android 版本)类。
这里描述了如何符合以及如何找到最适合您的解决方案: https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces
或者...
一个快速的解决方法是将“android 构建工具”版本降低到尚未实施此类限制的版本。 是一个小技巧,可以避免对新 android 版本的限制。 但要小心,因为 playmarket 不会接受使用太旧的“构建工具”编译的应用程序,所以它不是一个持久的解决方案。
升级到 OkHttp3 v3.12.12,这个问题已经修复了。
迁移到OkHttp3 4.4.0
已解决该问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.