java - OkHttp3无法在Android上开始握手

标签 java android kotlin okhttp

我提出一个简单的要求,只是检查我是否可以访问互联网:

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
}
而且我经常和catch一起进入java.net.SocketTimeoutException: Read timed out块。我发现OkHttp在okhttp3.internal.connection.RealConnection中没有走得更远:
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,Android并不真的希望我了解它的工作原理。
是某种错误还是我做错了什么?是否有修复程序或至少有解决方法?
日志:
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。
附言我记得,我无法将OkHttp更新为较新的版本,因为我还有另一个依赖于此特定版本的OkHttp的依赖项,因为较新的版本向后不兼容。

最佳答案

好像您的okhttp3库版本通过反射访问任何内部受限制的类(由新的android版本)。
这里描述了如何遵循以及如何为您找到最大的合适解决方案:https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces
要么...
一种快速的解决方法是将“Android构建工具”版本降低为尚未实现此类限制的版本。是一个小技巧,可以避免对新的android版本的限制。但是要小心,因为playmarket不会接受使用过旧的“构建工具”编译的应用程序,因此它不是持久的解决方案。

关于java - OkHttp3无法在Android上开始握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63381292/

相关文章:

java - 使用 HttpClient 发布文件内容?

java - 如何在 Android 中使用后台服务覆盖两次甚至 3 次单击电源按钮甚至音量增大/减小键?

android - ImageView 周围不需要的填充

android - Kotlin如何调用作为参数传递的方法

kotlin - 等于 Kotlin 中的重载

android - 如何在 Kotlin 中完全实现 Navigation Drawer 模板

java - 使用 ResideMenu lib 时删除菜单项

java - Java线程池任务执行队列

android - iOS/Android 上的信标通知

android - 如何在Android中动态设置布局参数?