Android应用程序崩溃okhttp3 HTTP FAILED:javax.net.ssl.SSLException:读取错误:系统调用期间I/O错误,软件导致连接中止

Posted

技术标签:

【中文标题】Android应用程序崩溃okhttp3 HTTP FAILED:javax.net.ssl.SSLException:读取错误:系统调用期间I/O错误,软件导致连接中止【英文标题】:Android app crash okhttp3 HTTP FAILED: javax.net.ssl.SSLException: Read error: I/O error during system call, Software caused connection abort 【发布时间】:2021-01-15 17:53:37 【问题描述】:

我正在开发 android 原生 kotlin 项目。 我正在使用 Android 版本 10 的 android real Oneplus 6 设备上测试应用程序。 请从 build.gradle 文件中找到以下详细信息,了解我用于项目的最新 okhttp 和改造依赖项。 okhttp

implementation "com.squareup.okhttp3:okhttp:4.9.0"
implementation "com.squareup.okhttp3:logging-interceptor:4.9.0"` 

改造

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

我已经为okhttpclient设置了相关的超时时间。

.connectTimeout(HTTP_CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(HTTP_READ_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(HTTP_WRITE_TIMEOUT, TimeUnit.SECONDS)

我正在使用 okhttp3.Interceptor。请在下面找到实现。

import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response

class AuthorizationInterceptor(private val sharedPreferenceService: SharedPreferenceService) :
    Interceptor 

    override fun intercept(chain: Interceptor.Chain): Response 
        val requestBuilder = chain.request().newBuilder()
            .addHeader("Content-Type", "application/json")
            .addHeader("Accept", "application/json")

        return chain.proceed(requestBuilder.build())
    
  

观察/问题

    如果 API 调用正在进行并且我们尝试更改或禁用网络/互联网,则只要从 sn-ps 上方执行以下行,okhttp3 本身就会在内部崩溃,因此应用程序崩溃。 return chain.proceed(requestBuilder.build())

我从我的 android 工作室中找到了下面的 okhttp 内部崩溃日志,它可以帮助您找到根本原因并进行修复。

FATAL EXCEPTION: main
    Process: com.pg.posm, PID: 8770
    javax.net.ssl.SSLException: Read error: ssl=0x7afca87588: I/O error during system call, Software caused connection abort
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.pg.posm, PID: 26238
    java.net.ConnectException: Failed to connect to hostname/ip:port

我还尝试使用 try-catch 将 Interceptor sn-ps 包裹在上面,但 okhttp3 本身仍然崩溃,因此 App 崩溃了。 我们没有任何控制来解决它。 请在下面找到带有包装的 try-catch 实现的拦截器 sn-ps。

import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
import timber.log.Timber
import java.io.IOException

class AuthorizationInterceptor(private val sharedPreferenceService: SharedPreferenceService) :
    Interceptor 

    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response 
        val requestBuilder = chain.request().newBuilder()
            .addHeader("Content-Type", "application/json")
            .addHeader("Accept", "application/json")
     
        try 
            return chain.proceed(requestBuilder.build())
        catch (e: Throwable) 
            
            if (e is IOException) 
                
                throw e
             else 
                
                throw IOException(e)
            
        
       

任何人都可以尝试制作带有相关设置和sn-ps的小型android项目并查看。 请为世界上许多人面临的这个阻止程序问题提供必要的修复或方法。 如果您需要更多详细信息,请告诉我。我很乐意为您提供。

【问题讨论】:

但是,我看到你做了一个throw 的异常,你在哪里以及如何处理它? @BogdanAndroid 我发现了问题。我已经使用 viewModelScope.launch(globalCoroutineExceptionHandler) 方法解决并处理了这个问题。 【参考方案1】:

我正在努力解决这个问题。事实上,这个错误并不奇怪。

如你所说

如果 API 调用正在进行并且我们尝试更改或禁用 网络/互联网,okhttp3 本身在下面立即崩溃 行从上面 sn-ps 执行,所以应用程序崩溃了。

这对你来说为什么这么奇怪?

如日志所示

FATAL EXCEPTION: main
Process: com.pg.posm, PID: 8770
javax.net.ssl.SSLException: Read error: ssl=0x7afca87588: I/O error during system call,
Software caused connection abort

你有一个 SSL/TLS 连接,这意味着,在建立与服务器的连接和传输数据之前,有很多员工是透明地发生的,例如:

握手 发送/接收公钥 生成会话密钥 建立安全通道

上述操作,其中安全通道仅对当前连接的安全套接字有效。

再次支持你的声明

如果 API 调用正在进行并且我们尝试更改或禁用 网络/互联网

实际上,上述动作使之前连接的安全套接字无效并抛出SslException(MitM保护)。

我希望以上陈述对您有所帮助。

【讨论】:

以上是关于Android应用程序崩溃okhttp3 HTTP FAILED:javax.net.ssl.SSLException:读取错误:系统调用期间I/O错误,软件导致连接中止的主要内容,如果未能解决你的问题,请参考以下文章

Android 上的 okhttp 出现错误,预期为 null,但 okhttp3.internal.http1.Http1Codec

Android笔记-使用okhttp3库发送http请求

url编码okhttp3 android删除%20

android okhttp3带cookie请求

Android Okhttp3+Retrofit2网络加载效率优化

Android OkHttp3简介和使用详解