SocketException:java.net.SocketException:socket is closed release build。

5

我们在处理Android网络请求时遇到了问题,更确切地说是随机收到的

SocketException:
java.net.SocketException: socket is closed
    at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(ConscryptFileDescriptorSocket.java:551)

看起来请求似乎不会超时,但异常抛出非常快,并且似乎仅在发布模式下发生,我们猜测这可能与ProGuard有关。

我们正在使用Retrofit、Moshi和RxAndroid进行网络请求。有人遇到过这样的问题吗?

我们的依赖项及其版本:

implementation ‘io.reactivex.rxjava2:rxandroid:2.1.1’
implementation ‘io.reactivex.rxjava2:rxjava:2.2.9’
implementation ‘com.squareup.retrofit2:adapter-rxjava2:2.5.0//Moshi
def moshiVersion = “1.12.0”
implementation “com.squareup.moshi:moshi:$moshiVersion”
kapt “com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion”
implementation “com.squareup.retrofit2:converter-moshi:2.9.0"
implementation “com.squareup.moshi:moshi-kotlin:1.8.0”
//Networking
implementation ‘com.squareup.okhttp3:logging-interceptor:3.12.1’
implementation ‘com.squareup.retrofit2:retrofit:2.6.4’
implementation ‘com.squareup.retrofit2:converter-scalars:2.1.0’

我们所有的模型都使用了@Keep注解进行了标注:
@Keep
class ModelDTO(
  @field:Json(name = “field1")
  var field1: String? = null,
  @field:Json(name = “field2”)
  var field2: List<String>? = null
)
HttpClient + Retrofit:
val client = OkHttpClient.Builder()
  .connectTimeout(300, TimeUnit.SECONDS)
  .writeTimeout(300, TimeUnit.SECONDS)
  .readTimeout(300, TimeUnit.SECONDS)
client.retryOnConnectionFailure(true)
  .addNetworkInterceptor { chain ->
    val request = chain.request().newBuilder().addHeader(“Connection”, “close”).build()
    chain.proceed(request)
  }
val moshi = Moshi.Builder()
  .add(KotlinJsonAdapterFactory())
  .build()
val retrofitBuilder = Retrofit.Builder()
retrofitBuilder.baseUrl(BuildConfig.BASE_URL)
retrofitBuilder.client(client)
  .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
  .addConverterFactory(MoshiConverterFactory.create(moshi).asLenient())
  .addCallAdapterFactory(
    RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io())
  )

我们的 Gradle 配置:

        release {
        debuggable false
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        consumerProguardFiles 'proguard-rules.pro'
    }
2个回答

2

经过多次尝试,我们通过以下方式解决了这个问题:

.connectionPool(ConnectionPool(0, 1, TimeUnit.NANOSECONDS)).protocols(listOf( Protocol.HTTP_1_1))

这已经被添加到OkHttpClient中 :) 运行起来非常好!


1
你好,能否详细说明一下你在哪里应用了这个更改以及它是如何解决问题的?谢谢! - fast3r
这段代码是做什么的? - Sri Krishna

0

您可以在pro-guard文件中添加以下代码:

-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
-dontwarn okio.**

但是你使用R8,一切都包含在内。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接