繁体   English   中英

OkHttp3 无法在 Android 上开始握手

[英]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 outcatch块。 我发现 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()中发生了什么,因为显然sslSocketcom.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,这个问题已经修复了。

https://square.github.io/okhttp/changelog_3x/#version-3129

迁移到OkHttp3 4.4.0已解决该问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM