Android平台网络连接架构分析-connectivityservice框架流程word版本
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android平台网络连接架构解析
2016-09
李国辉
ligh6@
一概述
截止到最新的7.0版本,android网络连接管理系统一直都由四个service组成,分别是ConnectivityService,NetworkPolicyManagerService,NetworkManagementService,NetworkStatsService共同配合完成网络连接和管理功能,其中核心服务是ConnectivityService,而本文也会着重介绍该service的架构,四个service中NetworkPolicyManagerService通过NetworkPolicyManager对外提供SDK接口,而ConnectivityService通过ConnectivityManager
对外提供SDK接口,整体的框架图如下:
1. ConnectivityService提供数据连接管理服务,负责管理Mobile,WIFI,BT,Ethernet几大类网络连接,同时提供VPN和Tethering服务。
workPolicyManagerService提供网络策略管理服务,NetworkPolicyManagerService维护
网络使用策略,策略可以从一个策略文件读取(策略文件保存在系统目录下的netpolicy.xml 文件中)。
也可以通过NetworkPolicyManager对外提供的设置策略接口(setNetworkPolicies
及setUidPolicy)进行设置,NetworkPolicyManagerService能够根据这些设置或从策略文件中读取的策略控制网络连接。
另外NetworkPolicyManagerService还具有动态调节网络连接限额及动态设置网络连接的功能,动态调节网络连接限额机制是通过INetworkStatsService访问NetworkStatsService服务获得上面设置或读取的策略匹配的网络连接类型的传输统计信息(NetworkPolicyManagerService采用NetworkTemplate进行网络连接类型的匹配),并根据这些信息生成有效的规则,并提交给ConnectivityService服务,并调用NetworkManagementService 的setInterfaceQuota函数对网络连接的带宽限额。
workStatsService提供网络传输数据流量统计服务,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)中。
workManagementService提供对物理网络接口的管理服务,ConnectivityService、NetworkPolicyManagerService、NetworkStatsService三个服务都通过INetworkManagementService接口跨进程访问NetworkManagementService服务,实现与系统底层网络物理接口的各类操作,比如设置IP路由表,限制流量,或者获取流量统计数据。
二ConnectivityService框架及流程
(一)整个Android的网络连接框架中,ConnectivityService是核心服务,实现对系统的所有数据连接进行管理,包括物理连接、虚拟连接以及共享连接。
是ConnectivityManager的具体实现,实现了IConnectivityManager接口。
在SystemServer的init2中进行初始化,并增加到ServiceManager中。
该服务在SystemServer.java中随开机而启动:
try {
log.i(TAG, "Connectivity Service");
connectivity = new ConnectivityService(
context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
networkStats.bindConnectivityManager(connectivity);
networkPolicy.bindConnectivityManager(connectivity);
} catch (Throwable e) {
reportWtf("starting Connectivity Service", e);
}
ConnectivityService服务通过NetworkAgent类和NetworkFactory类对象进行底层物理连
接的管理。
它主要提供以下几类服务:
1.监视网络连接状态,从中获取网络信息,包括(Wi-Fi, GPRS, UMTS, etc)
2.当网络状态改变时发送广播通知
3.当网络连接失败尝试连接其他网络
4.提供API让应用程序获取可用的网络状态
5.通过Tethering对象提供网络连接共享服务
6.通过Vpn对象提供VPN连接服务。
整体框架如下:
(二)ConnectivityService支持的网络连接类型包括五个默认的数据连接类型,另外还有八个可以和独立的数据连接类型共存的子类型,定义在ConnectivityMnager.java文件中:public static final int TYPE_MOBILE_MMS = 2; (用于多媒体消息服务的移动数据连接类型,可以和MOBILE_TYPE数据连接类型相同也可以不同)
public static final int TYPE_MOBILE_SUPL = 3; (定位设备的安全用户平面定位服务用的移动数据连接类型,可以和MOBILE_ TYPE数据连接类型相同也可以不同)
public static final int TYPE_MOBILE_DUN = 4; (用于执行拨号网络桥接的移动数据连接类型,可以和MOBILE_ TYPE数据连接类型相同也可以不同)
public static final int TYPE_MOBILE_HIPRI = 5; (一个具有最高优先级的移动数据连接类型,与MOBILE _ TYPE类型除了路由设置不同外,其它方面都相同。
在路由设置时,如果默认路由存在,则仅当请求进程必须存取移动DNS服务及IP明确的通过requestRouteToHost函数请求时使用这个数据连接接口)
public static final int TYPE_WIMAX = 6;//(属TYPE_WIFI)
public static final int TYPE_BLUETOOTH = 7;
public static final int TYPE_DUMMY = 8;
public static final int TYPE_ETHERNET = 9;
public static final int TYPE_MOBILE_FOTA = 10; (用于空中固件升级的移动数据连接)
public static final int TYPE_MOBILE_IMS = 11; (用于IP多媒体子系统的移动数据连接类型)public static final int TYPE_MOBILE_CBS = 12; (用于品牌服务的移动数据连接类型)
public static final int TYPE_WIFI_P2P = 13; (用于WIFI点对点连接)
public static final int TYPE_MOBILE_IA = 14;
public static final int TYPE_MOBILE_EMERGENCY = 15;
public static final int TYPE_PROXY = 16;
public static final int TYPE_VPN = 17;
(三)以移动数据为例阐述上层应用如何通过Connectivityservice打开数据连接,以及Telephony如何在Connectivityservice注册自己的Agent
打开数据连接的流程:
1.Application调用SDK接口startUsingNetworkFeature
2.Request被发送到ConnectivityService服务中
3.ConnectivityService通过NetworkFactory将request发送到Telephony内部
4.Telephony负责Setup data call
当数据连接打开后,在Connectivityservice注册Agent的流程如下:
1.DataConnection状态机在DcActiveState中实例化一个NetworkAgent
workAgent的构造函数中调用RegisterNetworkAgent函数向ConnectivityService注册代理函数
3.移动数据的Agent被发送到ConnectivityService服务中
4.ConnectivityService将该Agent注册到自己的list中,并对同类型的Agent进行分数对比,如果存在同类型的Agent,则分数高的替代分数低的,而分数低的会被执行关闭操作。