ANDROID 系统网络连接和管理机制

   网络连接功能介绍
       ANDROID 系统网络连接和管理服务由四个系统服务C onnectivityServiceNetworkPolicyManagerServiceNetworkManagementServiceNetworkStatsService共同配合完成网络连接和管理功能,四个服务只有C onnectivityServiceNetworkPolicyManagerService两个服务通过 NetworkPolicyManagerConnectivityManager两个客户端对象对应用程序提供对外 SDK接口,而 NetworkManagementServiceNetworkStatsService没有对外提供 SDK接口 ,但设置应用程序可以通过获取系统服务接口使用 NetworkManagementServiceNetworkStatsService服务 .
     四个服务之间的关系类图如下:

         
                                                     图 1  网络连接系统类图

        ConnectivityService提供数据连接管理服务,N etworkPolicyManagerService提供网络策略管理服务, NetworkStatsService提供网络传输数据统计服务, NetworkManagementService提供对物理网络接口的管理服务, connectivityService也包括 VPNTethering对象提供虚拟连接及共享连接管理。
        ConnectivityService、N etworkPolicyManagerServiceNetworkStatsService三个服务都通过 INetworkManagementService接口跨进程访问 NetworkManagementService服务,实现与网络接口的交互及信息读取。
        NetworkStatsServiceNetworkPolicyManagerService两个服务还通过 IConnectivityManager接口与 connectivityService服务通讯,从 connectivityService读取网络连接的信息及打开数据连接的策略控制。
        ConnectivityService服务也通过 INetworkPolicyManager接口调用 NetworkPolicyManagerServiceAPI,读取网络限额信息,登记监听对象。 connectivityService服务通过 NetworkPolicyManagerService服务的 registerListener函数向 NetworkPolicyManagerService服务注册一个 INetworkPolicyListener.Stub监听桩对象。 NetworkPolicyManagerService通过该监听对象的远程代理接口向 ConnectivityService服务传送规则变化通知。
       另外C onnectivityService服务的 TetheringVPN对象及 NetworkPolicyManagerServiceNetworkStatsService服务的内部 NetworkAlertObserver类型的对象都直接或间接派生自 INetworkManagementEventObserver.Stub,且四个对象都登记为 NetworkManagementService的监听对象, NetworkManagementService服务通过 INetworkManagementEventObserver接口向这些对象传送网络接口事件通知。
       NetworkPolicyManagerService维护网络使用策略,策略可以从一个策略文件读取(策略文件保存在系统目录下的 netpolicy.xml文件中)。也可以通过 NetworkPolicyManager对外提供的设置策略接口( setNetworkPoliciessetUidPolicy)进行设置, NetworkPolicyManagerService能够根据这些设置或从策略文件中读取的策略控制网络连接。另外 NetworkPolicyManagerService还具有动态调节网络连接限额及动态设置网络连接的功能,动态调节网络连接限额机制是通过 INetworkStatsService访问 NetworkStatsService服务获得上面设置或读取的策略匹配的网络连接类型的传输统计信息( NetworkPolicyManagerService采用 NetworkTemplate进行网络连接类型的匹配),并根据这些信息生成有效的规则,并提交给C onnectivityService服务,并调用 NetworkManagementService setInterfaceQuota函数对网络连接的带宽限额进行控制。
     动态设置网络连接规则的机制是 NetworkPolicyManagerService服务通过检测系统发出的一些相关事件(在 NetworkPolicyManagerService的启动 systemReady函数中注册),包括 ActivityManager服务中 IProcessObserveronForegroundActivitiesChangedonProcessDied回调事件, NetworkManager服务中 INetworkManagementEventObserverlimitReached回调事件,以及 ACTION_SCREEN_ON  CONNECTIVITY_ACTION_IMMEDIATEACTION_PACKAGE_ADDEDACTION_UID_REMOVEDACTION_NETWORK_STATS_UPDATEDACTION_ALLOW_BACKGROUNDINTENT事件,当这些事件发生时,根据事件不同对网络规则进行不同设置,如与应用程序相关的事件调用 updateRulesForUidLocked函数对 uid 涉及的 NetworkRule进行更新,其它事件通过 updateNetworkEnabledLocked函数调用 connectivityServicesetPolicyDataEnable函数对特定网络连接类型的数据连接进行设置。
         NetworkStatsService服务定期调用 performPoll函数获得网络传输统计信息, performPoll函数通过调用 NetworkManagementService服务的 getNetworkStatsUidDetailgetNetworkStatsSummarygetNetworkStatsTethering函数从 /proc/目录下的包含网络传输统计数据的文件中读取网络统计信息,并转换为 NetworkStatsHistory数据结构,保存到以网络接口名称对应的 NetworkIdentitySet类型和 UID 对应的 UidStatsKey类型的变量为 key NetworkStatsService的三个 HashMap变量中。然后根据 performPoll传进来的参数标志信息(指示不同的 PERSIST方法)调用 writeNetworkDevStatsLockedwriteNetworkXtStatsLockedwriteUidStatsLocked函数把 HashMap变量中的统计信息分别写入系统目录下的三个相应的 BIN文件( netstats.binnetstats_xt.binnetstats_uid.bin)中。
        NetworkManagementService的一个重要功能是与本地 netd进程进行通讯,完成对网络物理接口的操作。 NetworkManagementService通过 NativeDaemonConnector与本地 netd进程通过 LocalSocket建立连接进行双向通讯,发送命令,读取事件和命令应答消息,对网络接口的实际操作由 netd进程完成。 NativeDaemonConnector对象是一个实现 Runnable接口的对象, NativeDaemonConnector对象在 NetworkManagementService创建的线程中运行。
        NativeDaemonConnector通过实例化时从 NetworkManagementService传进来的回调函数向 NetworkManagementService传送从 netd进程读取的事件,主要事件有接口增加、接口移出、接口状态变化、 LINK状态变化等接口改变事件以及带宽控制事件。
connectivityService 连接实现机制
      整个类图中C onnectivityService服务是核心,实现对系统的所有数据连接进行管理,包括物理连接、虚拟连接以及共享连接。
        ConnectivityService服务通过 NetworkStateTracker类对象进行物理连接的管理、监控各种类型的网络连接,从中获取网络信息,C onnectivityService服务通过 Tethering对象提供网络连接共享服务,通过Vpn对象提供 VPN连接服务。
        ANDROID 4.0 版本准备支持的网络连接类型包括五个默认的同时只能激活一个的数据连接类型: MOBILE _ TYPEWIFI _ TYPEBLUETOOTH _ TYPEETHERNET _ TYPEWIMAX _ TYPEWIMAX _ TYPE尚未实际实现)。另外还有八个可以和独立的数据连接类型共存的子类型: MOBILE_MMS _ TYPE(用于多媒体消息服务的移动数据连接类型,可以和 MOBILE_TYPE数据连接类型相同也可以不同); MOBILE_SUPL_ TYPE(定位设备的安全用户平面定位服务用的移动数据连接类型,可以和 MOBILE_ TYPE数据连接类型相同也可以不同); MOBILE_DUN_ TYPE(用于执行拨号网络桥接的移动数据连接类型,可以和 MOBILE_ TYPE数据连接类型相同也可以不同); MOBILE_HIPRI_ TYPE(一个具有最高优先级的移动数据连接类型,与 MOBILE _ TYPE类型除了路由设置不同外,其它方面都相同。在路由设置时,如果默认路由存在,则仅当请求进程必须存取移动 DNS服务及 IP明确的通过 requestRouteToHost函数请求时使用这个数据连接接口); MOBILE_FOTA_ TYPE(用于空中 固件升级的移动数据连接); MOBILE_IMS_ TYPE(用于 IP多媒体子系统的 移动数据连接类型); MOBILE_CBS_ TYPE(用于品牌服务的移动 数据连接类型),WIFI _P2P(用于 WIFI点对点连接)。
      
                     
                                                       2  NetworkStateTracker类图
         ConnectivityService在实例化时读取 frameworksasecoreeses alues 下的 config.xml 资源文件的networkAttributes 属性 ,并 networkAttributes 属性的每个连接实例化一个 NetworkConfig 对象,然后根据 NetworkConfig 对象为每个默认的数据连接类型采用单例模式实例化一个具体 NetworkStateTracker对象(每个具体 NetworkStateTracker对象的派生关系如图 2 所示)。
         每个具体的实际 NetworkStateTracker对象都对应一个特定连接的服务,如 EthernetDataTracker对应一个 EthernetService,且每个具体的 NetworkStateTracker对象通过对应服务的远程管理对象与服务交互,读取服务的信息。如 EthernetDataTracker通过读取 EthernetService对应的信息, MobileDataStateTracker通过接口I TelephonyTelephony服务交互, WifiStateTracker通过 WifiManager接口与 WifiService服务交互。
         ConnectivityService通过 NetworkStateTracker对象实现对网络连接的控制和管理,每个连接都对应一个优先级,当几个默认类型的连接同时可用时, ConnectivityService选择最高优先级的可用连接。 系统默认的网络优先级定义在 frameworksasecoreeses alues 下的 config.xml 中的 networkAttributes属性中
   
        "ethernet,9,9,1,-1,true"
        "wifi,1,1,1,-1,true"
        "mobile,0,0,0,-1,true"
        "mobile_mms,2,0,2,60000,true"
        "mobile_supl,3,0,2,60000,true"
        "mobile_hipri,5,0,3,60000,true"
        "mobile_fota,10,0,2,60000,true"
        "mobile_ims,11,0,2,60000,true"
        "mobile_cbs,12,0,2,60000,true"
        "wifi_p2p,13,1,0,-1,true"
   
         ConnectivityService服务也通过 NetworkStateTracker获得连接的状态信息及对网络状态事件进行监控。 ConnectivityService通过 NetworkStateTracker对象的 startMonitoring函数启动数据连接的监控, ConnectivityService服务的消息处理句柄通过 startMonitoring函数传给 NetworkStateTracker对象, NetworkStateTracker对象通过该句柄向 ConnectivityService传送网络状态事件。    
         ConnectivityService通过 NetworkStateTracker对象可以获取的数据连接信息主要包含三类: LinkProperties描述一个网络连接属性信息(包含网络地址、网关、 DNSHTTP代理等属性信息),一个网络连接可能由多个地址、多个网关、多个 DNS,但仅有一个 HTTP代理, LinkCapabilities(描述一个网络连接能力方面的信息,包括带宽、延迟等), NetworkInfo(描述一个给定类型的网络接口的状态方面的信息,包括网络连接状态、网络类型、网络可连接性、是否漫游等信息)。 ConnectivityService通过 NetworkStateTracker对象的三个接口可以获得这些信息( getNetworkInfogetLinkPropertiesgetLinkCapabilities),并通过 getActiveNetworkInfogetNetworkInfogetAllNetworkInfogetLinkPropertiesgetAllNetworkState等函数对外提供这方面的信息。 ConnectivityService服务调用 NetworkStateTrackerreconnectteardownsetRadiosetUserDataEnablesetPolicyDataEnable等函数实现对特定网络连接的控制。
        ConnectivityService服务通过 Tethering对象为 WIFIBLUETOOTH连接提供连接共享服务(其它设备使用另一个设备的连接,如 WIFI热点等), connectivityService服务通过 tether函数启动网络接口的 Tethering服务。可以通过蓝牙、 WIFIUSB对其它设备提供 Tethering服务。
  

                                                                      图 3  Tethering 类图
        Tethering对象使用了状态模式来实现共享连接机制的实现,为每个状态创建一个状态对象,一个状态对象根据不同情景可以切换到另一个状态对象。 Tethering类图见图 3所示, Tethering对象为每一个使用共享连接的物理接口维护一个 TetherInterfaceSM类型的状态机,管理 Tethering接口的状态。 TetherInterfaceSM状态机在 NetworkManagementService服务触发的 interfaceAdded回调中实例化。 TetherInterfaceSM类型的状态机包括 InitialState(初始状态)、 StartingState(启动状态)、 TetheredState(共享状态)、 UnavailableState(连接不可用状态)四个状态。 TetherInterfaceSM通过 isAvailableisTetheredisErroredgetLastError等函数对外提供 Tethering接口的状态信息,从而使 TetheringgetTetherableIfacesgetTetheredIfacesgetTetheredIfacePairsgetTetheringErroredIfacesgetLastTetherError等函数可以从接口对应的状态机中获得 Tethering接口的状态。 TetherInterfaceSM状态机在正常共享工作情况下应该处于 TetheredState状态,在 TetheredState状态通过 NetworkManagementServicetetherInterface的函数来添加使用共享连接的接口。
      另外 Tethering对象还提供了一个 TetherMasterSM类型的主控状态机,提供共享连接的启动、停止等管理及连接状态事件的监控并向 TetherInterfaceSM状态机发送事件通知。 TetherMasterSM状态机的状态包括两个大类: TetherMasterUtilStateErrorStateTetherMasterUtilState类型的状态包括 InitialState(初始状态)、 TetherModeAliveState(共享模式激活状态)两个状态。 ErrorState类型的状态包括 SetIpForwardingEnabledErrorStateSetIpForwardingEnabledErrorStateSetIpForwardingDisabledErrorStateStartTetheringErrorStateStopTetheringErrorStateSetDnsForwardersErrorState等出错状态。正常共享工作情况下 TetherMasterSM状态机处于 TetherModeAliveState状态,在 TetherModeAliveState状态打开共享连接,并调用 NetworkManagementService服务的 setIpForwardingEnabledsetDnsForwardersstartTethering函数启动共享连接服务。
          Tethering对象从 frameworksasecoreeses alues 下的 config.xml的资源文件中的 config_tether_upstream_types属性中读取可用的共享连接类型, item值为 1 对应 WIFI类型。
   
        1
   

         TetherInterfaceSM状态机由 Tethering对象的 tether函数启动,并使 TetherInterfaceSMTetherMasterSM状态机从初始状态推进到正常共享状态。
         TetherMasterSM还采用观察者模式向 TetherMasterSM状态机发送事件, TetherMasterSM状态机维护一个 TetherInterfaceSM状态机数组列表, TetherMasterSM状态机通过该列表向列表中登记的每个 TetherInterfaceSM状态机发送 Tethering接口状态事件(包括错误状态)。 TetherMasterSM状态机也可以直接向某个 TetherInterfaceSM状态机发送 Tethering接口状态事件。
         Tethering接口的添加及共享连接的启动、停止、 tether dns set Ip Forward  Enabled 等功能由 NetworkManagementService服务通过调用 NativeDaemonConnectordoCommand函数向底层 netd  进程发送命令完成,由 netd  进程实际完成以上工作。
         ConnectivityService服务通过 prepareVpn establishVpn、、 protectVpn三个函数并调用 VPN对象的相应函数( prepareestablishprotect)建立 VPN连接和维护 VPN连接。 VPN对象在 establish函数中通过 JNI 调用建立 VPN连接接口并设置 VPN连接地址和路由。(转自固弘博客)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值