第十一篇 ANDROID 系统网络连接和管理机制
一 网络连接功能介绍
ANDROID 系统网络连接和管理服务由四个系统服务ConnectivityService、NetworkPolicyManagerService、NetworkManagementService、NetworkStatsService共同配合完成网络连接和管理功能,四个服务只有ConnectivityService、NetworkPolicyManagerService两个服务通过NetworkPolicyManager、ConnectivityManager两个客户端对象对应用程序提供对外SDK接口,而NetworkManagementService、NetworkStatsService没有对外提供SDK接口,但设置应用程序可以通过获取系统服务接口使用NetworkManagementService、NetworkStatsService服务.
四个服务之间的关系类图如下:
<ignore_js_op>
图1 网络连接系统类图
ConnectivityService提供数据连接管理服务,NetworkPolicyManagerService提供网络策略管理服务,NetworkStatsService提供网络传输数据统计服务,NetworkManagementService提供对物理网络接口的管理服务,connectivityService也包括VPN、Tethering对象提供虚拟连接及共享连接管理。
ConnectivityService、NetworkPolicyManagerService、NetworkStatsService三个服务都通过INetworkManagementService接口跨进程访问NetworkManagementService服务,实现与网络接口的交互及信息读取。
NetworkStatsService、NetworkPolicyManagerService两个服务还通过IConnectivityManager接口与connectivityService服务通讯,从connectivityService读取网络连接的信息及打开数据连接的策略控制。
ConnectivityService服务也通过INetworkPolicyManager接口调用NetworkPolicyManagerService的API,读取网络限额信息,登记监听对象。connectivityService服务通过NetworkPolicyManagerService服务的registerListener函数向NetworkPolicyManagerService服务注册一个INetworkPolicyListener.Stub监听桩对象。 NetworkPolicyManagerService通过该监听对象的远程代理接口向ConnectivityService服务传送规则变化通知。
另外ConnectivityService服务的Tethering、VPN对象及NetworkPolicyManagerService、NetworkStatsService服务的内部NetworkAlertObserver类型的对象都直接或间接派生自INetworkManagementEventObserver.Stub,且四个对象都登记为NetworkManagementService的监听对象,NetworkManagementService服务通过INetworkManagementEventObserver接口向这些对象传送网络接口事件通知。
NetworkPolicyManagerService维护网络使用策略,策略可以从一个策略文件读取(策略文件保存在系统目录下的netpolicy.xml文件中)。也可以通过NetworkPolicyManager对外提供的设置策略接口(setNetworkPolicies及setUidPolicy)进行设置,NetworkPolicyManagerService能够根据这些设置或从策略文件中读取的策略控制网络连接。另外NetworkPolicyManagerService还具有动态调节网络连接限额及动态设置网络连接的功能,动态调节网络连接限额机制是通过INetworkStatsService访问NetworkStatsService服务获得上面设置或读取的策略匹配的网络连接类型的传输统计信息(NetworkPolicyManagerService采用NetworkTemplate进行网络连接类型的匹配),并根据这些信息生成有效的规则,并提交给ConnectivityService服务,并调用NetworkManagementService 的setInterfaceQuota函数对网络连接的带宽限额进行控制。
动态设置网络连接规则的机制是NetworkPolicyManagerService服务通过检测系统发出的一些相关事件(在NetworkPolicyManagerService的启动systemReady函数中注册),包括ActivityManager服务中IProcessObserver的onForegroundActivitiesChanged及onProcessDied回调事件,NetworkManager服务中INetworkManagementEventObserver的limitReached回调事件,以及ACTION_SCREEN_ON 、CONNECTIVITY_ACTION_IMMEDIATE、ACTION_PACKAGE_ADDED、ACTION_UID_REMOVED、ACTION_NETWORK_STATS_UPDATED、ACTION_ALLOW_BACKGROUND等INTENT事件,当这些事件发生时,根据事件不同对网络规则进行不同设置,如与应用程序相关的事件调用updateRulesForUidLocked函数对uid 涉及的NetworkRule进行更新,其它事件通过updateNetworkEnabledLocked函数调用connectivityService的setPolicyDataEnable函数对特定网络连接类型的数据连接进行设置。
NetworkStatsService服务定期调用performPoll函数获得网络传输统计信息,performPoll函数通过调用NetworkManagementService服务的getNetworkStatsUidDetail、getNetworkStatsSummary及getNetworkStatsTethering函数从/proc/目录下的包含网络传输统计数据的文件中读取网络统计信息,并转换为NetworkStatsHistory数据结构,保存到以网络接口名称对应的NetworkIdentitySet类型和UID 对应的UidStatsKey类型的变量为key 的NetworkStatsService的三个HashMap变量中。然后根据performPoll传进来的参数标志信息(指示不同的PERSIST方法)调用writeNetworkDevStatsLocked、writeNetworkXtStatsLocked、writeUidStatsLocked函数把HashMap变量中的统计信息分别写入系统目录下的三个相应的BIN文件(netstats.bin、netstats_xt.bin、netstats_uid.bin)中。
NetworkManagementService的一个重要功能是与本地netd进程进行通讯,完成对网络物理接口的操作。NetworkManagementService通过NativeDaemonConnector与本地netd进程通过LocalSocket建立连接进行双向通讯,发送命令,读取事件和命令应答消息,对网络接口的实际操作由netd进程完成。NativeDaemonConnector对象是一个实现Runnable接口的对象,NativeDaemonConnector对象在NetworkManagementService创建的线程中运行。
NativeDaemonConnector通过实例化时从NetworkManagementService传进来的回调函数向NetworkManagementService传送从netd进程读取的事件,主要事件有接口增加、接口移出、接口状态变化、LINK状态变化等接口改变事件以及带宽控制事件。
二 connectivityService 连接实现机制
整个类图中ConnectivityService服务是核心,实现对系统的所有数据连接进行管理,包括物理连接、虚拟连接以及共享连接。
ConnectivityService服务通过NetworkStateTracker类对象进行物理连接的管理、监控各种类型的网络连接,从中获取网络信息,ConnectivityService服务通过Tethering对象提供网络连接共享服务,通过Vpn对象提供VPN连接服务。
ANDROID 4.0 版本准备支持的网络连接类型包括五个默认的同时只能激活一个的数据连接类型:MOBILE _ TYPE、WIFI _ TYPE、BLUETOOTH _ TYPE、ETHERNET _ TYPE、WIMAX _ TYPE(WIMAX _ 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点对点连接)。
<ignore_js_op>
图2 NetworkStateTracker类图
ConnectivityService在实例化时读取frameworksasecoreesesalues下的config.xml资源文件的networkAttributes属性,并networkAttributes属性的每个连接实例化一个NetworkConfig对象,然后根据NetworkConfig对象为每个默认的数据连接类型采用单例模式实例化一个具体NetworkStateTracker对象(每个具体NetworkStateTracker对象的派生关系如图2 所示)。
每个具体的实际NetworkStateTracker对象都对应一个特定连接的服务,如EthernetDataTracker对应一个EthernetService,且每个具体的NetworkStateTracker对象通过对应服务的远程管理对象与服务交互,读取服务的信息。如EthernetDataTracker通过读取EthernetService对应的信息, MobileDataStateTracker通过接口ITelephony与Telephony服务交互,WifiStateTracker通过WifiManager接口与WifiService服务交互。
ConnectivityService通过NetworkStateTracker对象实现对网络连接的控制和管理,每个连接都对应一个优先级,当几个默认类型的连接同时可用时,ConnectivityService选择最高优先级的可用连接。系统默认的网络优先级定义在frameworksasecoreesesalues下的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描述一个网络连接属性信息(包含网络地址、网关、DNS、HTTP代理等属性信息),一个网络连接可能由多个地址、多个网关、多个DNS,但仅有一个HTTP代理,LinkCapabilities(描述一个网络连接能力方面的信息,包括带宽、延迟等),NetworkInfo(描述一个给定类型的网络接口的状态方面的信息,包括网络连接状态、网络类型、网络可连接性、是否漫游等信息)。ConnectivityService通过NetworkStateTracker对象的三个接口可以获得这些信息(getNetworkInfo,getLinkProperties、getLinkCapabilities),并通过getActiveNetworkInfo、getNetworkInfo、getAllNetworkInfo、getLinkProperties、getAllNetworkState等函数对外提供这方面的信息。ConnectivityService服务调用NetworkStateTracker的reconnect、teardown、setRadio、setUserDataEnable、setPolicyDataEnable等函数实现对特定网络连接的控制。
ConnectivityService服务通过Tethering对象为WIFI、BLUETOOTH连接提供连接共享服务(其它设备使用另一个设备的连接,如WIFI热点等),connectivityService服务通过tether函数启动网络接口的Tethering服务。可以通过蓝牙、WIFI、USB对其它设备提供Tethering服务。
<ignore_js_op>
图3 Tethering 类图
Tethering对象使用了状态模式来实现共享连接机制的实现,为每个状态创建一个状态对象,一个状态对象根据不同情景可以切换到另一个状态对象。Tethering类图见图3所示, Tethering对象为每一个使用共享连接的物理接口维护一个TetherInterfaceSM类型的状态机,管理Tethering接口的状态。TetherInterfaceSM状态机在NetworkManagementService服务触发的interfaceAdded回调中实例化。TetherInterfaceSM类型的状态机包括InitialState(初始状态)、StartingState(启动状态)、TetheredState(共享状态)、UnavailableState(连接不可用状态)四个状态。TetherInterfaceSM通过isAvailable、isTethered、isErrored、getLastError等函数对外提供Tethering接口的状态信息,从而使Tethering的getTetherableIfaces、getTetheredIfaces、getTetheredIfacePairs、getTetheringErroredIfaces、getLastTetherError等函数可以从接口对应的状态机中获得Tethering接口的状态。TetherInterfaceSM状态机在正常共享工作情况下应该处于TetheredState状态,在TetheredState状态通过NetworkManagementService的tetherInterface的函数来添加使用共享连接的接口。
另外Tethering对象还提供了一个TetherMasterSM类型的主控状态机,提供共享连接的启动、停止等管理及连接状态事件的监控并向TetherInterfaceSM状态机发送事件通知。TetherMasterSM状态机的状态包括两个大类:TetherMasterUtilState及ErrorState。TetherMasterUtilState类型的状态包括InitialState(初始状态)、TetherModeAliveState(共享模式激活状态)两个状态。ErrorState类型的状态包括SetIpForwardingEnabledErrorState、SetIpForwardingEnabledErrorState、SetIpForwardingDisabledErrorState、StartTetheringErrorState、StopTetheringErrorState、SetDnsForwardersErrorState等出错状态。正常共享工作情况下TetherMasterSM状态机处于TetherModeAliveState状态,在TetherModeAliveState状态打开共享连接,并调用NetworkManagementService服务的setIpForwardingEnabled、setDnsForwarders、startTethering函数启动共享连接服务。
Tethering对象从frameworksasecoreesesalues下的config.xml的资源文件中的config_tether_upstream_types属性中读取可用的共享连接类型,item值为1 对应WIFI类型。
1
TetherInterfaceSM状态机由Tethering对象的tether函数启动,并使TetherInterfaceSM和TetherMasterSM状态机从初始状态推进到正常共享状态。
TetherMasterSM还采用观察者模式向TetherMasterSM状态机发送事件,TetherMasterSM状态机维护一个TetherInterfaceSM状态机数组列表,TetherMasterSM状态机通过该列表向列表中登记的每个TetherInterfaceSM状态机发送Tethering接口状态事件(包括错误状态)。TetherMasterSM状态机也可以直接向某个TetherInterfaceSM状态机发送Tethering接口状态事件。
Tethering接口的添加及共享连接的启动、停止、tether dns set 、Ip Forward Enabled 等功能由NetworkManagementService服务通过调用NativeDaemonConnector的doCommand函数向底层netd 进程发送命令完成,由netd 进程实际完成以上工作。
ConnectivityService服务通过prepareVpn 、establishVpn、、protectVpn三个函数并调用VPN对象的相应函数(prepare、establish、protect)建立VPN连接和维护VPN连接。VPN对象在establish函数中通过JNI 调用建立VPN连接接口并设置VPN连接地址和路由。(转自固弘博客)