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

 网络连接功能介绍

       ANDROID 系统网络连接和管理服务由四个系统服务ConnectivityServiceNetworkPolicyManagerServiceNetworkManagementServiceNetworkStatsService共同配合完成网络连接和管理功能,四个服务只有ConnectivityServiceNetworkPolicyManagerService两个服务通过NetworkPolicyManagerConnectivityManager两个客户端对象对应用程序提供对外SDK接口,而NetworkManagementServiceNetworkStatsService没有对外提供SDK接口,但设置应用程序可以通过获取系统服务接口使用NetworkManagementServiceNetworkStatsService服务.

     四个服务之间的关系类图如下:

 

        

                                                     图网络连接系统类图

 

        ConnectivityService提供数据连接管理服务,NetworkPolicyManagerService提供网络策略管理服务,NetworkStatsService提供网络传输数据统计服务,NetworkManagementService提供对物理网络接口的管理服务,connectivityService也包括VPNTethering对象提供虚拟连接及共享连接管理。

        ConnectivityService、NetworkPolicyManagerServiceNetworkStatsService三个服务都通过INetworkManagementService接口跨进程访问NetworkManagementService服务,实现与网络接口的交互及信息读取。

        NetworkStatsServiceNetworkPolicyManagerService两个服务还通过IConnectivityManager接口与connectivityService服务通讯,从connectivityService读取网络连接的信息及打开数据连接的策略控制。

        ConnectivityService服务也通过INetworkPolicyManager接口调用NetworkPolicyManagerServiceAPI,读取网络限额信息,登记监听对象。connectivityService服务通过NetworkPolicyManagerService服务的registerListener函数向NetworkPolicyManagerService服务注册一个INetworkPolicyListener.Stub监听桩对象。 NetworkPolicyManagerService通过该监听对象的远程代理接口向ConnectivityService服务传送规则变化通知。

       另外ConnectivityService服务的TetheringVPN对象及NetworkPolicyManagerServiceNetworkStatsService服务的内部NetworkAlertObserver类型的对象都直接或间接派生自INetworkManagementEventObserver.Stub,且四个对象都登记为NetworkManagementService的监听对象,NetworkManagementService服务通过INetworkManagementEventObserver接口向这些对象传送网络接口事件通知。

       NetworkPolicyManagerService维护网络使用策略,策略可以从一个策略文件读取(策略文件保存在系统目录下的netpolicy.xml文件中)。也可以通过NetworkPolicyManager对外提供的设置策略接口(setNetworkPoliciessetUidPolicy)进行设置,NetworkPolicyManagerService能够根据这些设置或从策略文件中读取的策略控制网络连接。另外NetworkPolicyManagerService还具有动态调节网络连接限额及动态设置网络连接的功能,动态调节网络连接限额机制是通过INetworkStatsService访问NetworkStatsService服务获得上面设置或读取的策略匹配的网络连接类型的传输统计信息(NetworkPolicyManagerService采用NetworkTemplate进行网络连接类型的匹配),并根据这些信息生成有效的规则,并提交给ConnectivityService服务,并调用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 连接实现机制

      整个类图中ConnectivityService服务是核心,实现对系统的所有数据连接进行管理,包括物理连接、虚拟连接以及共享连接。

        ConnectivityService服务通过NetworkStateTracker类对象进行物理连接的管理、监控各种类型的网络连接,从中获取网络信息,ConnectivityService服务通过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在实例化时读取frameworks\base\core\res\res\values下的config.xml资源文件的networkAttributes属性,并networkAttributes属性的每个连接实例化一个NetworkConfig对象,然后根据NetworkConfig对象为每个默认的数据连接类型采用单例模式实例化一个具体NetworkStateTracker对象(每个具体NetworkStateTracker对象的派生关系如图2 所示)。

         每个具体的实际NetworkStateTracker对象都对应一个特定连接的服务,如EthernetDataTracker对应一个EthernetService,且每个具体的NetworkStateTracker对象通过对应服务的远程管理对象与服务交互,读取服务的信息。如EthernetDataTracker通过读取EthernetService对应的信息, MobileDataStateTracker通过接口ITelephonyTelephony服务交互,WifiStateTracker通过WifiManager接口与WifiService服务交互。

         ConnectivityService通过NetworkStateTracker对象实现对网络连接的控制和管理,每个连接都对应一个优先级,当几个默认类型的连接同时可用时,ConnectivityService选择最高优先级的可用连接。系统默认的网络优先级定义在frameworks\base\core\res\res\values下的config.xml中的networkAttributes属性中

    <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>

    </string-array>

         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对象从frameworks\base\core\res\res\values下的config.xml的资源文件中的config_tether_upstream_types属性中读取可用的共享连接类型,item值为1 对应WIFI类型。

    <integer-array translatable="false" name="config_tether_upstream_types">

        <item>1</item>

    </integer-array>

 

         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连接地址和路由。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
100多个Android的实用开源小应用,包含Android -- 引导页面的实现 Android APP引导页大全 Android Push it单机版事件管理APP Android RecycleView+任意头尾布局+拖拽换位+拖拽删除demo Android sql练习合集 Android 仿12306 Android 优秀计步器 Android 体重计算源码 Android 使用Gallery_tabhost实现标签效果图源码 Android 例子源码根据CPU使用时间计算程序电量使用 Android 医院介绍电子书籍源码 android 图片涂鸦 Android 基于局域网的P2P聊天系统 Android 天气预报 Android 实时浏览各种文章APP Android 开发辅助工具 Android 手机新闻客户端源码 Android 手机点餐下单项目源码 Android 新闻客户端 Android 日历控件源码 Android 日记系统源码(数据库的基本操作) Android 极简强大VR本地播放器 Android 用handler机制联网获取图片 Android 百宝箱 Android 简单的翻译软件 Android 精美仿开眼视频跨平台App Android 自定义数字密码输入键盘 Android 趣味答题应用 Android 音乐播放器 Android--AA记账助手 Android--Hide-Music-Player Android-3D卡片效果 android个人中心页面效果源码 Android仿微博、微信、qq 点击缩略图TransferImage Android例子源码IOS风格的uitableview列表 Android例子源码IOS风格的圆角分组设置页面 Android例子源码不断保持后台唤醒的例子源码 Android例子源码九宫格密码输入例子 Android例子源码仿QQ的头像选择弹出的对话框 Android例子源码仿多看阅读的左右平移翻页效果小例子 Android例子源码可以通过网络请求内容的自定义列表选择Dialog Android例子源码图片旋转缩放加盖水印透明倾斜扭曲处理 Android例子源码实现Windows8风格的Dialog Android例子源码强大的listview效果集合项目 Android例子源码模仿IOS音乐的可拖动导航栏功能 Android例子源码模仿安卓微信、云播雷达扫描动画效果 Android例子源码类似58同城的通过滑屏控制引导页 Android例子源码计步器圆形UI设计 Android例子源码适合新手学习的listview使用源码 android及时通讯源码 android可伸缩日历效果源码 Android应用源码CreativeCommons新闻客户端半成品 Android应用源码使用Vitamio框架的网络在线电视直播 Android应用源码全能网络视频播放器 Android应用源码单机版电子阅读器 Android应用源码可以直接发邮件的简洁课程表项目源码 Android应用源码可以管理U盘的文件管理器 Android应用源码哔哩哔哩弹幕网站源码 Android应用源码基于bmob的即时聊天 Android应用源码大学生考勤项目源码 Android应用源码带密码登陆的密码保险箱 Android应用源码开关WIFI热点搜索连接开源有注释 Android应用源码比较不错的新闻客户端 Android应用源码省市联动选择城市的天气预报源码 Android应用源码简单的NB微博项目源码 Android应用源码简洁的随手记事项目源码 Android应用源码类似小米的天天文件管理器 Android应用源码老人居家看护系统 Android应用源码蝌蚪听书第二版听书神器 android掌上几分钟视频应用源码 Android版GitHub Android简单通讯源码:手机控制PC的关机、重启 Android软件源码短信通讯录毕设项目带需求报告 Android软件源码类似时间轴记录的记账记事本 Android项目源码 studio和eclipse双版本仿bilibili客户端 Android项目源码GPS实时定位位置共享 Android项目源码QQ登录语音合成桌面控件天气预报 Android项目源码v2ex技术社区非官方客户端 Android项目源码事件日程管理APP Android项目源码任阅小说阅读器高仿追书神器 Android项目源码在线课堂教育UI框架源码 Android项目源码基于Bmob的糖尿病用药提醒追踪系统 Android项目源码基于MVVM架构的非官方知乎日报APP Android项目源码基于安卓的简单租车系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值