第十一篇 ANDROID 系统网络连接和管理机制与架构
一 网络连接功能介绍
ANDROID 系统网络连接和管理服务由四个系统服务ConnectivityService、NetworkPolicyManagerService、NetworkManagementService、NetworkStatsService共同配合完成网络连接和管理功能,四个服务只有ConnectivityService、NetworkPolicyManagerService两个服务通过NetworkPolicyManager、ConnectivityManager两个客户端对象对应用程序提供对外SDK接口,而NetworkManagementService、NetworkStatsService没有对外提供SDK接口,但设置应用程序可以通过获取系统服务接口使用NetworkManagementService、NetworkStatsService服务.
四个服务之间的关系类图如下:
图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点对点连接)。
图2 NetworkStateTracker类图
ConnectivityService在实例化时读取frameworks\base\core\res\res\values下的config.xml资源文件的networkAttributes属性,并networkAttributes属性的每个连接实例化一个NetworkConfig对象,然后根据NetworkConfig对象为每个默认的数据连接类型采用单例模式实例化一个具体NetworkStateTracker对象(每个具体NetworkStateTracker对象的派生关系如图2所示)。
<string-array translatable="false" name="networkAttributes">
<item>"ethernet,9,9,1,-1,true"</item>
<item>"wifi,1,1,1,-1,true"</item>
<item>"mobile,0,0,0,-1,true"</item>
<item>"mobile_mms,2,0,2,60000,true"</item>
<item>"mobile_supl,3,0,2,60000,true"</item>
<item>"mobile_hipri,5,0,3,60000,true"</item>
<item>"mobile_fota,10,0,2,60000,true"</item>
<item>"mobile_ims,11,0,2,60000,true"</item>
<item>"mobile_cbs,12,0,2,60000,true"</item>
<item>"wifi_p2p,13,1,0,-1,true"</item>
<integer-array translatable="false" name="config_tether_upstream_types">
TetherInterfaceSM状态机由Tethering对象的tether函数启动,并使TetherInterfaceSM和TetherMasterSM状态机从初始状态推进到正常共享状态。
第十一篇 ANDROID 系统网络连接和管理机制与架构相关推荐
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...
- Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...
- 深入理解Android系统网络架构
引言:这篇文章以WiFi举例,介绍了Android系统网络架构.其内容包含:网络链路的连接和注册.网络有效性检测和网络优选.Android系统网络防火墙和几种场景下的网络策略等,文章的最后也列举了几种 ...
- [转载] 深入理解Android系统网络架构
引言:这篇文章以WiFi举例,介绍了Android系统网络架构.其内容包含:网络链路的连接和注册.网络有效性检测和网络优选.Android系统网络防火墙和几种场景下的网络策略等,文章的最后也列举了几种 ...
- [转载]深入理解Android系统网络架构
转自 https://blog.csdn.net/qq_14978113/article/details/89182253 引言:这篇文章以WiFi举例,介绍了Android系统网络架构.其内容包含: ...
- android系统电量优化,基于Android系统网络耗电量优化方法的.pdf
基于Android系统网络耗电量优化方法的 2012年第10期,第 45卷 通 信 技 术 Vol.45,No.10,2012 总第250期 Communications Technology No. ...
- 怎么在win7链接无线网络连接服务器,Win7系统网络连接一直显示正在获取网络地址但是连不上网解决方法...
电脑上不了网的原因很多,比如是网络设置问题.路由器问题.运营商问题.最近一个Win7用户,网络连接一直显示,正在获取网络地址但是连不上网,但是其它电脑可以上网,那么说明是电脑设置问题,那么该如何解决呢 ...
- Win7系统网络连接图标显示红叉但可以正常上网怎么办
近日小编在使用win7系统的时候,发现这样一个情况,就是电脑右下角的网络连接图标显示红叉,可是明明已经连接上网络了,而且可以正常上网,这是怎么回事呢?接下来给大家讲解一下Win7系统网络连接图标显示红 ...
最新文章
- Highcharts X轴纵向显示
- 关于luci的几个问题一
- Java工具类——通过配置XML验证Map
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]42蒙哥马利乘法,哪里泄漏侧信道路吗?
- http中指定使用worker/prefork
- Ubuntu下安装配置java及环境变量
- 开发软件安装教程-MATLAB2016b安装教程图解
- 基于MATLAB的车牌识别(GUI)
- 身份认证是计算机网络系统的用户,计算机网络知识:网络认证技术之身份认证技术...
- iReport使用入门
- 开通OSChina的感概
- 深入学术研究,物理学家用VR演示弦理论猜想
- 禁止移动端微信内置浏览器调节字体大小
- 虎克哈克环槽铆钉机 铆接回收机振动筛设备 钢结构集装箱铆接机
- [转载]Python中包装(wrapping)与代理(delegation)
- 如何从零开始搭建直播平台,从flash时代的rtmp到过渡期的flv和webrtc的未来以及简单聊聊webassmbly
- 联想小新锐7000 装win7系统图解
- k8s之vpa浅析(附带案例)
- dcloud 5+ 监听安卓前后台切换状态 并后台运行程序
- 21 世纪什么最贵?那必须得是“人才”啊,一本书带你读懂 TCP-IP 协议