网络连通性(NetworkMonitor)分析

1,257 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情 

一、简介

网络连接成功(状态变为CONNECTED)之后会由ConnectivityService通知NetworkMonitor做网络连通性分析,分析结果会以回调方式(notifyNetworkTested)通知ConnectivityServiceConnectivityService会根据连通性分析结果对网络进行处理,如果网络不连通或连通受限会根据当前网络检测机制给出提示或直接断开网络连接。

二、开关配置

网络连通性分析开关由Settings.Global表的"captive_portal_mode"配置,有3中取值方式,如下:

  • 取值0:关闭网络连通性分析
  • 取值1:检测到网络不连通,给出提示,由用户决定是否连接。(默认)
  • 取值2:检测到网络不连通,直接断开网络连接。

三、网络连通性原理

网络连通性分析调用的是NetworkMonitor.javaisCaptivePortal()方法,原理就是向一些特定的网址发起http请求,根据responseCode来分析网络连通性。在中用于网络连通性分析的有3个网址:httpsUrlhttpUrlfallbackUrl,这些网址是系统可配置的。

3.1、访问的网址配置

  • httpsUrl:优先取NetworkStack模块资源文件配置R.string.config_captive_portal_https_url,如果为空取Settings.Global.CAPTIVE_PORTAL_HTTPS_URL("captive_portal_https_url")配置的值,仍为空取NetworkStack模块资源文件配置R.string.default_captive_portal_https_url

目前生效的配置如下:

packages/modules/NetworkStack/res/values-mcc460/config.xml

   <string name="default_captive_portal_https_url" translatable="false">https://connectivitycheck.gstatic.com/generate_204</string> 

packages/modules/NetworkStack/res/config.xml

   <string name="default_captive_portal_https_url" translatable="false">https://www.google.com/generate_204</string>  
  • httpUrl:优先取NetworkStack模块资源文件配置R.string.config_captive_portal_http_url,如果为空取Settings.Global.CAPTIVE_PORTAL_HTTP_URL("captive_portal_http_url")配置,仍为空取NetworkStack模块资源文件配置R.string.default_captive_portal_http_url

目前生效的配置如下: packages/modules/NetworkStack/res/config.xml:

<string name="default_captive_portal_http_url" translatable="false">http://connectivitycheck.gstatic.com/generate_204</string>
  • fallbackUrl:是从一组url中随机取出一个,一组url的配置是string-array,优先取NetworkStack模块资源文件配置R.array.config_captive_portal_fallback_urls,如果为空,则取Settings.Global相关配置,如果仍为空则取NetworkStack模块资源文件配置R.array.default_captive_portal_fallback_urls。 目前生效的配置如下: packages/modules/NetworkStack/res/values-mcc460/config.xml:

               <string-array name="default_captive_portal_fallback_urls" translatable="false">

                   <item>http://www.googleapis.cn/generate_204</item>  

              </string-array>  

packages/modules/NetworkStack/res/config.xml:


      <string-array name="default_captive_portal_fallback_urls" translatable="false">  

          <item>http://www.google.com/gen_204</item>  

          <item>http://play.googleapis.com/generate_204</item>  

      </string-array>

3.2、网络连通性结果判定

访问网络会返回httpResponseCode,根据httpResponseCode将结果分为如下3类:

  • FAILED_CODE:对应code599,此外这还是默认值,当发生异常以及其他未判定code都认为是failed
  • PORTAL_CODE:对应httpResponseCode值为[200, 399]中排除204,因为204表示success
  • SUCCESS_CODE:对应httpResponseCode值为204 此外额外定义了一个状态PARTIAL_CODE表示网络部分可用,这个状态是结合3个网址访问结果判断的,不是访问网址返回的。

最终结果按顺序判定如下:

  1. 如果访问httpUrl结果为PORTAL_CODE,结果返回PORTAL
  2. 如果访问httpUrls结果为PORTAL_CODESUCCESS_CODE,结果对应返回PORTALSUCCESS
  3. 如果访问fallbackUrl结果为PORTAL_CODE,结果返回PORTAL 如果httpsUrl返回FAILED_CODE,并且
  4. httpUrlfallbackUrl至少一个返回SUCCESS_CODE,结果返回PARTIAL
  5. 以上均不满足结果返回FAILED