Android 11更新后出现UnknownHostException错误

19

问题:一旦返回UnknownHostException,用户将继续接收相同的错误,除非重新安装应用程序或重新启动设备。

在使用Android 11操作系统的用户中,只有少数用户会遇到问题。

最大的问题是当出现错误时,每个请求都会连续返回相同的错误。

据用户称,重新安装应用程序或重新启动设备将解决该问题。

似乎99%的用户都使用三星设备。有时也会出现Google Pixel手机。

无论是Http还是Https都会出现相同的错误。

无论是Wifi、5G还是LTE都会出现相同的错误。

该请求方法使用POST,我不知道是否也会发生在GET上,我不使用GET。

此外,线程可以是后台或前台,或者两者都有。

这是我的代码

Gradle:

android {
    minSdkVersion 21
    
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_1_8.toString()
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    /* RETROFIT */
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'

    /* OKHTTP */
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'
    implementation 'com.squareup.okhttp3:okhttp-urlconnection:4.9.0'

    /* RXJAVA RXANDROID */
    implementation 'io.reactivex.rxjava3:rxjava:3.0.11'
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'

}

创建请求:


interface ApiService {

    @POST("get-data")
    fun getData(@Body parameter : CustomParameter): Single<Response<CustomObject>>

    companion object {

        private val rxJava3CallAdapterFactory: RxJava3CallAdapterFactory
            get() = RxJava3CallAdapterFactory.createWithScheduler(Schedulers.io())

        private fun okHttpClient(): OkHttpClient {
            val okHttpClientBuilder = okHttpClientBuilder()

            okHttpClientBuilder.addNetworkInterceptor { chain ->
                val request = chain.request()
                val response = chain.proceed(request)
                if (response.code >= 400) {
                    handleNetworkError()
                }
                response
            }

            okHttpClientBuilder.addInterceptor { chain ->
                val request = chain.request()
                chain.proceed(request)
            }

            return okHttpClientBuilder.build()
        }

        fun createApiService(context: Context): ApiService {
            val retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(rxJava3CallAdapterFactory)
                    .client(okHttpClient())
                    .build()

            return retrofit.create(ApiService::class.java)
        }
    }
}

呼叫请求(在活动中):

    ApiService.createMainWeatherApiService().getData(CustomParameter())
              .subscribeOn(Schedulers.io())
              .observeOn(AndroidSchedulers.mainThread())
              .subscribe(
                      { res ->
                          handleSuccess()
                      },
                      { error ->
                          // UnknownHostException!!!!
                          handleFail()
                      }
              ).apply { compositeDisposable.add(this) }

我在 okhttp 上创建了一个问题:https://github.com/square/okhttp/issues/6591


如果手机出现错误,是否可以在不重新安装或关闭应用程序的情况下切换到WiFi或4G?尝试在同一部手机上尝试2-3个不同的WiFi网络。 - Rohaitas Tanoli
我曾经遇到过类似的问题,那是Godaddy SSL的问题。转换为Amazon SSL解决了这个问题。但在我的情况下,有时切换到WiFi也能解决问题。我测试了3-4个WiFi。 - Rohaitas Tanoli
我从Godaddy换到了另一家公司,但是出现了相同的症状。 - hanmolee
嗯,看起来我也有同样的问题。两个使用三星安卓11的用户报告了类似的问题,一周内应用程序中的所有请求都无法成功,显示互联网连接错误。重新安装应用程序可以解决问题。 - Koso
@hanmolee,你找到这个问题的解决方案了吗?我在使用移动数据时也遇到了与三星11设备相同的问题。在WiFi下一切正常。 - prabhatsdp
显示剩余3条评论
2个回答

0
你能否在事件监听器中包含输出,以显示OkHttp(通常)使用系统DNS提供程序进行的DNS调用?

https://stackoverflow.com/a/66398516/1542667

[0 ms] callStart: Request{method=GET, url=https://httpbin.org/get}
[11 ms] proxySelectStart: https://httpbin.org/
[12 ms] proxySelectEnd: [DIRECT]
[12 ms] dnsStart: httpbin.org
[55 ms] dnsEnd: [httpbin.org/54.147.165.197, httpbin.org/34.231.30.52, httpbin.org/54.91.118.50, httpbin.org/18.214.80.1, httpbin.org/54.166.163.67, httpbin.org/34.199.75.4]
[62 ms] connectStart: httpbin.org/54.147.165.197:443 DIRECT
[176 ms] secureConnectStart
[747 ms] secureConnectEnd: Handshake{tlsVersion=TLS_1_2 cipherSuite=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 peerCertificates=[CN=httpbin.org, CN=Amazon, OU=Server CA 1B, O=Amazon, C=US, CN=Amazon Root CA 1, O=Amazon, C=US] localCertificates=[]}
[765 ms] connectEnd: h2
[767 ms] connectionAcquired: Connection{httpbin.org:443, proxy=DIRECT hostAddress=httpbin.org/54.147.165.197:443 cipherSuite=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 protocol=h2}
[775 ms] requestHeadersStart
[783 ms] requestHeadersEnd
[993 ms] responseHeadersStart
[994 ms] responseHeadersEnd: Response{protocol=h2, code=200, message=, url=https://httpbin.org/get}
[999 ms] responseBodyStart
[999 ms] responseBodyEnd: byteCount=267
[999 ms] connectionReleased
[1000 ms] callEnd

第二个请求可以跳过这一步,如下所示,以重用连接。但在您的情况下,您希望在建立新连接之前进行新的DNS请求。

[0 ms] callStart: Request{method=GET, url=https://httpbin.org/get}
[1 ms] connectionAcquired: Connection{httpbin.org:443, proxy=DIRECT hostAddress=httpbin.org/54.147.165.197:443 cipherSuite=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 protocol=h2}
[1 ms] requestHeadersStart
[1 ms] requestHeadersEnd
[98 ms] responseHeadersStart
[99 ms] responseHeadersEnd: Response{protocol=h2, code=200, message=, url=https://httpbin.org/get}
[99 ms] responseBodyStart
[99 ms] responseBodyEnd: byteCount=267
[99 ms] connectionReleased
[99 ms] callEnd

如果它显示每次调用都进行查询,那么在您的程序中多次调用InetAddress.getAllByName(hostname).toList()可能会显示相同的行为。您预计会看到什么?

我按照你说的做了,但每次都像第一次那样更改DNS。这是找不到DNS的重要原因吗? - hanmolee
你把这个问题标记为OkHttp问题(同时也标记了retrofit、android和galaxy)。帮助我理解的第一件事是,你是否真的在每个请求中进行DNS调用。很可能的情况是,在Dns.SYSTEM内部的多次调用InetAddress.getAllByName(hostname).toList()最终返回相同的结果。这些三星手机是否有缓存DNS结果的特殊设置? - Yuri Schimke
2
InetAddress.getAllByName(hostname).toList() 的结果是 [hostName/2206:, hostName/2206:, hostName/, hostName/]。我的主机名正常显示。只有在一些三星和安卓11用户中才会出现症状。看起来像是三星设备的问题。- hanmolee 2天前 删除 - hanmolee

-3

问题不在于UnknownHostException是什么,而在于为什么它会持续发生在特定的应用程序上,尤其是在运行Android 11的三星设备上,并且为什么重新启动设备可以解决这个问题?有没有什么应用程序开发人员可以做来缓解影响数千用户的这个问题,而不需要让他们执行额外的步骤? - Cruceo
(如果重新启动设备,则可以解决问题)。可能是设备的问题。因为有些设备的互联网有时不稳定。(我有一种这样的设备) - Rezaul Khan
除此之外,设备上没有其他应用程序同时受到影响(也就是说,它们没有遇到网络连接问题)。这种情况直到升级到OkHttp 4.9.1(从3.12.12)后才开始出现,这表明可能有“某些事情”可以做。 - Cruceo
谢谢您的帮助,但是那些建议有点偏离主题。如果我们无法复制该问题,则记录响应正文(鉴于症状不会存在)也无法解决问题。由于系统重启后API URL可以正常使用,因此它与问题无关。 - Cruceo

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