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

第十一篇 ANDROID 系统网络连接和管理机制与架构

分类: android架构分析 8085人阅读 评论(3) 收藏 举报

 网络连接功能介绍

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

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

        

                                                     图网络连接系统类图

 

          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所示)。

         每个具体的实际NetworkStateTracker对象都对应一个特定连接的服务,如EthernetDataTracker对应一个EthernetService,且每个具体的NetworkStateTracker对象通过对应服务的远程管理对象与服务交互,读取服务的信息。如EthernetDataTracker通过读取EthernetService对应的信息, MobileDataStateTracker通过接口ITelephony与Telephony服务交互,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描述一个网络连接属性信息(包含网络地址、网关、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服务。

   

 

                                                                      图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对象从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函数启动,并使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连接地址和路由。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Socket客服聊天系统是一种基于Socket网络通信技术的客服服务解决方案。它通过在Android设备上建立起与服务器之间的TCP连接,实现了实时的客户与客服之间的在线沟通。 该系统架构一般包含客户端和服务器两个部分。在客户端方面,Android设备上运行着客户端应用程序,这个应用程序负责和服务器建立连接,并处理用户的操作。用户可以通过客户端应用程序发送消息、查询问题、提出建议等。客户端应用程序还可以接收来自服务器的消息和反馈信息,以便即时地展示给用户。 在服务器方面,一般采用高性能的服务器来处理多个客户端的请求。服务器应用程序负责接收来自客户端的消息,并将消息分发给相应的客服人员进行处理。服务器还会保存客服人员的信息和在线状态,以便能够将消息及时分发给空闲的客服人员处理。 实现这个系统需要一些Socket编程的知识和技巧。在Android客户端,要使用Socket类来建立和服务器的连接,并使用InputStream和OutputStream来进行数据的读写。服务器端可以使用Java提供的ServerSocket类来监听客户端的连接,并使用Socket类来接收和发送消息。 除了基本的通信功能,Android Socket客服聊天系统还可以扩展一些特性,如设置排队机制、用户身份验证、客服人员状态管理、消息记录与导出等。这些功能可以根据具体需求来实现,以提升系统的可用性和用户体验。 总而言之,Android Socket客服聊天系统是一种能够实现实时在线客服服务的解决方案。它通过利用Socket网络通信技术,使得用户与客服人员能够实时、便捷地进行沟通和交流,提高了客户服务的效率和质量。 ### 回答2: Android Socket 客服聊天系统是一种基于 Socket 技术的实时通讯系统,可以实现用户和客服之间的即时通讯和交流。 首先,Android Socket 客服聊天系统需要客户端和服务器端的支持。客户端通过 Socket 连接服务器端,实现与客服的实时通讯。在客户端,我们可以通过创建 Socket 对象来建立与服务器的连接,并通过输入输出流来发送和接收消息。 其次,客户端和服务器端需要制定一种通讯协议,以确保双方能够正确地解析和处理消息。通常情况下,可以使用 JSON 或者 XML 格式来传递消息,并在消息中定义相应的字段来标识消息类型、发送者、接收者、时间等信息。 在客户端,我们可以使用 Socket 连接服务器端,并通过输入输出流来发送和接收消息。当用户发送消息时,将消息转化为指定格式的字符串,然后通过输出流发送给服务器端;当收到服务器端的消息时,通过输入流解析接收到的消息,并展示给用户。 而在服务器端,我们需要创建一个监听指定端口的 Socket,并侦听客户端的连接请求。当客户端连接成功后,可以为每个客户端创建一个线程来处理与其的通讯,以避免阻塞其他客户端的连接。服务器端可以通过输入输出流来与客户端进行通讯,将接收到的消息转发给客服,并将客服的回复发送给对应的客户端。 此外,为了提高系统的稳定性和性能,可以考虑引入线程池来管理客户端的连接和通讯线程,并根据需要进行资源的释放和回收。 综上所述,Android Socket 客服聊天系统通过 Socket 通讯技术,实现了用户和客服之间的实时通讯。通过合理的设计和实现,可以实现安全、稳定和高效的客服聊天系统。 ### 回答3: Android socket客服聊天系统是一种在Android平台上运行的聊天系统,旨在提供实时的客服服务。该系统基于Socket编程实现,通过网络连接将客户端和客服端进行实时消息的传递。 在该系统中,客户端和客服端都是Android应用程序。客户通过应用程序连接到服务器并发送消息给客服,客服接收到消息后可以及时回复客户。整个聊天过程实现实时性,可以满足用户与客服之间即时交流的需求。 Android socket客服聊天系统的实现主要包括以下几个方面: 首先,需要建立客户端和服务器之间的网络连接。客户端通过Socket连接到服务器的IP地址和端口号,实现与服务器之间的通信。服务器监听指定端口,接收客户端的连接请求,并为每个连接创建一个新的线程进行消息的处理。 其次,客户端和服务器之间通过Socket传递消息。客户端发送消息给服务器,服务器接收到消息后可以针对不同的请求作出不同的响应。客户端可以通过不断接收服务器返回的消息,实现与客服的即时交流。 另外,为了保证系统的可靠性和稳定性,需要处理消息的丢失、重复以及乱序等问题。可以通过应用层协议的设计和消息的确认机制来解决这些问题,确保消息的正确传递和处理。 最后,为了提供更好的用户体验,可以对系统进行优化和改进。例如,可以增加消息的发送和接收状态的显示,实现消息的分组和搜索等功能,提高系统的性能和易用性。 总之,Android socket客服聊天系统是一种能够实现客户与客服实时交流的应用程序。它通过Socket连接将客户端和客服端进行实时消息的传递,为用户提供高效便捷的客服服务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值