[英]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.