Android 11 更新后出现 UnknownHostException

Posted

技术标签:

【中文标题】Android 11 更新后出现 UnknownHostException【英文标题】:UnknownHostException after Android 11 update 【发布时间】:2021-06-16 14:25:38 【问题描述】:

问题:一旦返回 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 ..! 我遇到过类似的问题,那就是 Godaddy SSL 问题。切换到亚马逊 ssl 解决了这个问题。但在我的场景中切换到 WiFi 有时会奏效。我测试了 3 4 WiFi。 @RohaitasTanoli 我会尝试更改域,谢谢您的建议 我从 Godaddy 转到另一家公司,但出现了同样的症状。 嗯,看来我也有同样的问题。三星 android 11 上的 2 位用户报告了类似的问题,一周内应用程序中的所有请求均未成功,并出现互联网连接错误。重新安装应用程序有帮助。 【参考方案1】:

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

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

[0 ms] callStart: Requestmethod=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: HandshaketlsVersion=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: Connectionhttpbin.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: Responseprotocol=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: Requestmethod=GET, url=https://httpbin.org/get
[1 ms] connectionAcquired: Connectionhttpbin.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: Responseprotocol=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的重要原因? 您将其作为 OkHttp 问题提出(与改造、android、galaxy 一起标记)。帮助我理解的第一件事是您是否真的对每个请求进行了 DNS 调用。很可能正在发生的一切是最终在 Dns.SYSTEM 中多次调用 InetAddress.getAllByName(hostname).toList() 会返回相同的结果。这些三星手机是否意味着它们正在缓存 DNS 结果? InetAddress.getAllByName(hostname).toList() 的结果是 [hostName/2206:~~, hostName/2206:~~, hostName/~~, hostName/~~] 我的主机名是正常出来。症状仅出现在某些三星和 Android 11 用户中。这似乎是三星设备的问题。 – hanmolee 2 天前 删除【参考方案2】:

抛出表示无法确定主机的 IP 地址。 Android Developer Documentation 希望这个网址对你有帮助:UnknownHostException Soultion

【讨论】:

问题不在于UnknownHostException 是什么;这是为什么在特定的应用程序上经常发生这种情况,主要是在运行 Android 11 的三星设备上,为什么重启设备可以解决问题?应用开发者是否可以采取任何措施来缓解这个影响数千名用户的问题,而不要求他们执行额外的步骤? (如果重启设备则解决问题)。可能是设备问题。因为有些设备是互联网有时不稳定。 (我有一个那种类型的设备) 除了设备上的其他应用程序似乎没有同时受到影响(例如,它们没有遇到网络连接问题)。在更新到 OkHttp 4.9.1(从 3.12.12)之前,我们也没有开始发生这种情况,这表明有一些事情可以完成 感谢您的帮助,但这些建议有点偏离目标。如果我们无法复制问题,那么记录响应正文(考虑到症状,无论如何都不存在)将无济于事。 API URL 也与问题无关,因为它在系统重新启动时起作用

以上是关于Android 11 更新后出现 UnknownHostException的主要内容,如果未能解决你的问题,请参考以下文章

更新到 Google Play 服务 11.8.0 后 Proguard 无法正常工作

在 Android Studio 中更新 buildToolsVersion '23.0.1' 后出现内存不足问题

Eclipse 更新Android SDK后,新建项目出现appcompat_v7project的相关问题

今天更新到 macOS Big Sur 11.3 后,Android 模拟器无法启动

更新到 Xcode 11 Swift 5.1 后出现 Google AdMob 错误

jpa缓存导致无法查询到更新后的数据&android出现ANR的一个解决办法