作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我提出一个简单的要求,只是检查我是否可以访问互联网:
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。
最佳答案
好像您的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/
我是一名优秀的程序员,十分优秀!