簡體   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