ConnectivityManager and ConnectivityService --- Telephony data Part III

ConnectivityManager 与 ConnectivityService ConnectivityService提供数据连接管理服务,NetworkPolicyManagerService提供网络策略管理服务,NetworkStatsService提供网络传输数据统计服务,NetworkManagementService提供对物理网络接口的管理服务,connectivityService也包括VPN、Tethering对象提供虚拟连接及共享连接管理。 Co... 阅读详情
ConnectivityManager and ConnectivityService

ConnectivityManager 和ConnectivityService的作用主要有五点:
1. 监听网络连接(WiFi, GPRS, UMTS等)。

  通过NetworkAgent监听网络连接的变化。NetworkAgent是bearer和ConnectivityService沟通的桥梁,
  bearer通过NetworkAgent将网络信息更新到ConnectivityService中; ConnectivityService通过
  NetworkAgent给bearer发送一些控制类的消息等。

2. 当网络连接发生变化时发送广播通知监听者。

发送的广播主要是ConnectivityManager.CONNECTIVITY_ACTION:android.net.conn.CONNECTIVITY_CHANGE

3. 当一个网络的连接断开时,尝试打开另外一个网络连接。

当NetworkAgent断开/去注册的时候,会rematch network 和 network request,新的network会建立。

4. 为应用程序查询可用网络状态提供API,其中包括反馈详细(fine-granted)/粗略(coarse-granted)信息的API。

反馈信息最详细(fine-granted)的API是getAllNetworkState,而getAllNetworks,getActiveNetwork
相比较算是反馈信息比较粗略的API。

5. 为需要数据业务的应用程序提供请求和选择网络的API。

供应用程序请求网络连接的API是requestNetwork(...)系列,针对不同的应用需求,同名方法有六个。

NetworkFactory

每个bearer(cellular, wifi等)都会创建NetworkFactory用来接收ConnectivityService发出来的”scored NetworkRequests”, 所以NetworkFactory会有很多,比如TelephonyNetworkFactory, WifiNetworkFactory和PhoneSwitcher.PhoneSwitcherNetworkRequestListener等。

NetworkAgent

NetworkAgent是bearer(cellular,wifi)和ConnectivityService通信的通道,所以会有很多的NetworkAgent,DataConnection.DcNetworkAgent和WifiStateMachine.WifiNetworkAgent等, NetworkAgent是和network对应的,所以如果一个bearer可以同时支持不同的network((IMS / Internet / MMS Apns on cellular, or perhaps connections with different SSID or P2P for Wi-Fi),那么它可以拥有多个NetworkAgent。作为通信通道,只有那些成功建立通道的NetworkAgent才会在ConnectivityService中保存,那些断开了通道的NetworkAgent会从ConnectivityService中删掉。

下面说说cellular相关的NetworkFactory:

和Cellular相关的NetworkFactory有两个 PhoneSwitcher.PhoneSwitcherNetworkRequestListener和TelephonyNetworkFactory(数量与slot/SIM 数量一致)。PhoneSwitcher构造了内部类PhoneSwitcherNetworkRequestListener(NetworkFactory子类)对象,并使用该对象在ConnectivityService中注册了监听,所以当ConnectivityService有网络请求(request/release)的时候PhoneSwitcher会收到消息。PhoneSwitcher在内部有个ArrayList类型的变量mPrioritizedDcRequests用来存储请求信息,新请求会添加到mPrioritizedDcRequests,release的请求会从mPrioritizedDcRequests中删除。PhoneSwitcher收到请求变化的消息后会调用PhoneSwitcher.onEvaluate方法来判断哪个phone需要active,哪个phone需要deactive, 并调用Ril.setDataAllowed方法通知modem,以及将新状态通知到TelephonyNetworkFactory。
PhoneSwitcher.onEvaluate方法是如何来判断哪个phone需要active/deactive的?PhoneSwitcher.onEvaluate会调用PhoneSwitcher.phoneIdForRequest方法对mPrioritizedDcRequests中的数据进行处理,mPrioritizedDcRequests中保存的是DcRequest对象,后者包含了NetworkRequest对象,NetworkRequest中又包含了NetworkCapabilities对象,NetworkCapabilities中包含了StringNetworkSpecifier,StringNetworkSpecifier中包含了sub Id 数据,根据sub Id数据可以获取对于的Phone Id; 如果没有这些数据,那么就使用默认数据SIM对应的Phone。

综上,PhoneSwitcher会负责active/deactive 对应phone的数据功能。TelephonyNetworkFactory也在ConnectivityService中注册了监听,但是和PhoneSwitcher的作用不同,TelephonyNetworkFactory负责根据满足条件的request去调用DcTracker.requestNetwork启动切换/apn,并创建data connection。
PhoneSwitcher和TelephonyNetworkFactory都监听了Subscription change和default data subscription change的事件:

PhoneSwitcher:

        try {
            tr.addOnSubscriptionsChangedListener("PhoneSwitcher", mSubscriptionsChangedListener);
        } catch (RemoteException e) {
        }

        mContext.registerReceiver(mDefaultDataChangedReceiver,
                new IntentFilter(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED));

TelephonyNetworkFactory:

        mSubscriptionMonitor.registerForSubscriptionChanged(mPhoneId, mInternalHandler,
                EVENT_SUBSCRIPTION_CHANGED, null);

        mIsDefault = false;
        mSubscriptionMonitor.registerForDefaultDataSubscriptionChanged(mPhoneId, mInternalHandler,
                EVENT_DEFAULT_SUBSCRIPTION_CHANGED, null);

当PhoneSwitcher收到消息后会去deactive/active相应的phone的数据功能;TelephonyNetworkFactory会去release/request 数据连接。

PhoneSwitcher.PhoneSwitcherNetworkRequestListener和TelephonyNetworkFactory在向ConnectivityService注册监听之前都设置了各自的capability filter和score filter。它们的capability filter是一样的,如下:

        NetworkCapabilities netCap = new NetworkCapabilities();
        netCap.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_CBS);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_IA);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_RCS);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_XCAP);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_EIMS);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
        netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);

TelephonyNetworkFactory的score filter是50; 而PhoneSwitcher.PhoneSwitcherNetworkRequestListener要收到所有的request,所以score filter是101。只有新request满足了capability filter和score filter后,它们才会做处理。除了使用capability和score过滤request外还可以使用重写(overridden)函数的方式,比如重写startNetwork/stopNetwork,addNetworkRequest/removeNetworkRequest。


下面说说开机初始化过程中发生的小故事:

这部分主要讲在开机初始化过程中,data connection建立之前,ConnectivityService、PhoneSwitcher以及TelephonyNetworkFactory之间代码流程,下方是一个流程图:
这里写图片描述
首先ConnectivityService的构造函数会创建一个默认的NetworkRequest对象(mDefaultRequest)。
PhoneSwitcher创建时会构造一个PhoneSwitcherNetworkRequestListener对象(NetworkFactory子类),然后用该对象在ConnectivityService中注册监听。ConnectivityService注册监听成功并通信成功之后便会发送CMD_REQUEST_NETWORK(使用mDefaultRequest)消息,经过一系列调用之后PhoneSwitcherNetworkRequestListener.needNetworkFor方法会被调用,该方法会发送一个EVENT_REQUEST_NETWORK,然后PhoneSwitcher.onRequestNetwork方法,PhoneSwitcher.onEvaluate和PhoneSwitcher.active方法相继被调用。
TelephonyNetworkFactory的构造函数里会调用PhoneSwitcher.registerForActivePhoneSwitch方法注册监听,PhoneSwitcher.active方法就会通知TelephonyNetworkFactory; TelephonyNetworkFactory注册监听时用的是EVENT_ACTIVE_PHONE_SWITCH,收到该消息时被调用的方法是TelephonyNetworkFactory.onActivePhoneSwitch,经过流程图中的一系列方法调用,适合network request的ApnContext会被设置成Enable状态,这样当需要的时候这个ApnContext便可以用于建立data connection。

TelephonyNetworkFactory能否调用DcTracker.requestNetwork去请求连接,要取决于PhoneSwitcher是否已经通过PhoneSwitcher.active方法通知了TelephonyNetworkFactory它所对应的卡可以连接网络。
对于单卡,这部分可能不重要; 但是对于双卡,而新的网络连接请求所用的卡和当前数据卡不一致时,这部分逻辑完成 了对卡的选择。

发彩信过程中使用mms APN的流程
发彩信需要使用MMS APN,MmsNetworkManager.acquireNetwork会调用ConnectivityManager.requesetNetwork方法请求网络连接,后面的流程和上面流程图展示的很相似; network request会发送到TelephonyNetworkFactory中,TelephonyNetworkFactory会调用DcTracker.requestNetwork, 在这个方法中选择合适的ApnContext(MMS),然后开始建立网络连接。
IMS apn是怎么使用的?
IMS模块通过ConnectivityManger.requestNetwork(…)方法请求使用IMS apn建立data connection。


ConnectivityService是怎么计算score的?
当有新的network requeset注册或者NetworkAgent发生变化(注册/去注册、score发生变化、NetworkCapabilities改变和调用setAcceptUnvalidated/setAvoidUnvalidated设置针对unvalidated network的操作)时,rematchAllNetworksAndRequests/rematchNetworkAndRequests会被调用,一些network request会有新的score,而一些network可能会被断开。

  1. 当有新的network requeset注册时,对应的方法是handleRegisterNetworkRequest。
  2. 当有新的NetworkAgent注册时,对应的方法是handleRegisterNetworkRequest。
  3. 当NetworkAgent去注册时,对应的方法是handleAsyncChannelDisconnected。
  4. 当NetworkAgent的score发生变化时,对应的方法是updateNetworkScore。
  5. 当NetworkAgent的NetworkCapabilities发生变化时,对应的方法是updateCapabilities。
  6. 当setAcceptUnvalidated/setAvoidUnvalidated被调用,设置针对unvalidated network的操作时; 对应的方法是handleSetAcceptUnvalidated/handleSetAvoidUnvalidated。

rematchNetworkAndRequests(NetworkAgentInfo newNetwork, …)方法会遍历所有的request判断参数network是否是某个request的最合适的network,如果是,那么将network的score更新request的score值,并通知NetworkFactory,NetworkFactory会根据score进行操作(release/request network)。
WiFi连接/断开时,会有对应的NetworkAgent注册/去注册以及score更新,所有注册的NetworkFactory都会收到消息,TelephonyNetworkFactory收到消息后会release当前的mobile network(cellular)。


结束!

Android Connectivity分析(2)- ConnectivityService ConnectivityService 描述 Connectivity的核心部分,对ConnectivityManager的实现,实现了IConnectivityManager接口。 在SystemServer的init2中进行初始化,并增加到ServiceManager中。 构造方法 创建单独的thread,进行handler消息处理 创建NetworkFactory 阅读详情

相关推荐

Android 15网络子系统深度解析(一):ConnectivityService与网络管理框架全解析

深入剖析Android 15核心网络服务ConnectivityService的架构设计、NetworkAgent/Factory机制、网络状态管理、以及WiFi/移动网络切换的完整流程

Cheson的专栏 1749

ConnectivityService分析

1.概述 2.分析 3.使用及实现 4.总结

wang 恒 的博客 5592

Android13 ConnectivityManager requestNetwork 流程分析

ConnectivityManager的requestNetwork方法是一个用于请求满足特定条件的网络连接的方法。它通常在应用需要特定类型网络的情况下使用,例如需要大量数据传输时可能会请求一个高带宽的网络。当满足NetworkRequest的条件时,requestNetwork会尝试主动去连接到一个满足条件的网络。通过ConnectivityManager和通过WifiManager连接网络的区别在于使用的API和功能。

liuning1985622的博客 3553

浅谈Android的ConnectivityService网络连接服务

ConnectivityService在 Android 系统中是一个核心的服务,它主要负责管理和监控网络连接的状态。这个服务是 Android 框架的一部分,为应用程序和系统服务提供了关于网络连接(如 wifi、mobile network、ethernet、bt-pan)的详细信息。ConnectivityService作为管理员身份,每种网络都会去向它注册,网络的使用权全靠它来分配。并实现了网络评分机制确保了系统能够最出作优的网络连接,从而为用户提供更好的网络体验。2。

teti3231052的博客 3802

Framework中的连接管理机制(原)

上一节《Wifi服务框架介绍》介绍了WIFI的大致框架,本文主要介绍连接管理中的几个重要角色,包括:NetworkInfo、NetworkAgent、ConnectivityService、ConnectivityManager等。         为了便于讨论,本文选取一个具体问题展开分析,那就是:当当前的网络连接变为不可用时,系统如何自动切换其他可用的网络连接的。         我们知道

阿杜的专栏 1万+

浅谈framework之ConnectivityService

文章目录1. 前言2. 服务的启动3. ConnectivityService3.1 动态ip拨号3.2 pppoe拨号3.3 静态ip拨号 1. 前言 这篇文章,主要是对之前学习ConnectivityService的再一次回顾与加深理解,先写个草稿,后面优化。 2. 服务的启动 frameworks/base/services/java/com/android/server/SystemServer.java 在判断网络可用的情况下,开启各个网络相关的服务,其中就有ConnectivityService: if (!disableNetwork) { ......//省略无关代

Android ConnectivityService框架

Android中提供的数据业务方式有几种:移动数据网络,WIFI,热点,网线等。这些数据业务本身可以独立使用,但是同一时刻,只能使用其中的一种数据业务方式。管理这些数据业务方式的使用由ConnectivityService,NetworkFactory,NetworkAgent,NetworkMonitor等来完成,ConnectivityService处于核心调度位置。 Connectivi...

Jimmy的专栏 6909

【首份】2023年30米分辨率土地利用遥感监测数据

为了恢复和重建我国土地利用变化的现代过程,更好地预测、预报土地利用变化趋势,地球资源数据云以美国陆地卫星Landsat 遥感影像数据作为主信息源,结合Sentinel系列数据,通过人工目视解译和机器学习方法,建立了国家尺度1:10 万比例尺多时期土地利用/土地覆盖遥感监测数据库(CNLUCC)因早期Landsat数据时空覆盖缺失,1972-1977年合成第一期数据,1978-1985年合成第二期数据,1986年起每年度生成一期数据。投影:Albers正轴等面积双标准纬线圆锥投影南标准纬线:25°N。

地球资源数据云的官方博客 3682

ConnectivityService框架初识

Android中提供的数据业务方式有几种:移动数据网络,WIFI,热点,网线等。这些数据业务本身可以独立使用,但是同一时刻,只能使用其中的一种数据业务方式。管理这些数据业务方式的使用由ConnectivityService,NetworkFactory,NetworkAgent,NetworkMonitor等来完成,ConnectivityService处于核心调度位置。ConnectivitySe

sjz4860402的专栏 1万+

TI IWR6843AOP雷达+DCA1000EVM数据采集:官方手册里的坑,我帮你踩完了

本文详细解析了TI IWR6843AOP雷达与DCA1000EVM数据采集实战中的12个关键细节,包括硬件连接陷阱、mmWave Studio隐藏设置、数据采集参数优化等,帮助开发者避开官方手册未提及的常见问题,提升数据采集效率和系统稳定性。

weixin_28366475的博客 1102

从实习生到独立上手:我是如何用海思PQTool搞定IPC图像调试的

本文分享了从实习生到独立使用海思PQTool进行IPC图像调试的成长历程。通过工具搭建、核心参数调整和实战案例,详细介绍了如何高效解决图像质量问题,特别强调了ISP调试中的关键参数和实用技巧,适合刚入门的图像调试工程师参考。

weixin_33756596的博客 312

【安卓Framework学习】安卓连接管理(ConnectivityService)之wifi连接及注册

之前介绍了一些wifi框架相关的内容,由于wifi框架在安卓连接框架中只是一个小部分,所以今天会分析一下wifi连接上后连接管理框架是如何管理这些网络连接等其他连接的。本篇中涉及到的安卓源码均来源于安卓11.由类名粗暴的理解为网络工厂,本人理解为所需要的网络由此类提供并控制。根据提供的不同的网络类型有不同的实现,wifi的实现类为,以太网的实现为。网络工厂在每个网络框架初始化时便会实例化一个对象出来与网络是否被使用或连接上无关,同时会向连接管理(

qq_39036223的博客 2940

VCU128开发板上手记:搞定100G以太网IP核与QSFP光模块的那些坑

本文详细介绍了在VCU128开发板上实现100G以太网IP核与QSFP光模块调试的实战经验。从硬件准备、IP核配置到QSFP模块控制信号处理,文章揭示了数据手册中未提及的关键细节,并提供了优化参数和压力测试方案,帮助开发者快速解决UltraScale+平台下的高速以太网部署难题。

weixin_30740295的博客 521

android NetworkMonitor和ConnectivityService记录

网络上都叫网络可用性校验,在WIFI和数据(以太网切换中使用)

yudelian的博客 1617

LeRobot 入门教程(四)SO-101机械臂组装教程

《SO-101机器人组装与配置指南》详细介绍了旗舰机器人SO-101的完整搭建流程。从获取3D打印零件、安装LeRobot软件和FeetechSDK,到分步组装6个关节的机械臂结构(含夹爪/手柄选项),指南提供了清晰的螺丝规格和安装位置说明。重点包括:电机ID/波特率设置方法、USB端口识别技巧、领导者/跟随者臂的校准流程,以及故障排查建议。完成组装后,用户可通过配套Python脚本校准机器人,为后续的自主学习任务做好准备。文档附有视频演示和技术支持通道,确保用户顺利完成机器人部署。

2506_90492529的博客 2582

光通量与辐射通量之间的换算

由理论和实验可知存在两种定义: 1W1W1W(瓦特)的频率为540×1012Hz540\times10^{12}Hz540×1012Hz(赫兹)的单色辐射的辐射通量等于683lm(流明)683lm(流明)683lm(流明).。 1lm1lm1lm的频率为540×1012Hz540\times10^{12}Hz540×1012Hz的单色通量等于1683=0.001464W\frac{1}{683}=0.001464W6831​=0.001464W。 从上述定义中我们可以得到什么呢?我们知道光速: c=3×

u011699626的博客 3273

ConnectivityService处理wifi连接

ConnectivityService用来管理系统中所有网络,谁能连接,谁需要断开。在连接一个网络是,收集网络信息,通过ConnetivityManager提供给应用使用。 在WIFI连接过程中,到链路层L2ConnectedState状态时,有: class L2ConnectedState extends State { @Override public void en...

zhangdaxia2的博客 3065

YOLO11改进|注意力机制篇|引入先验卷积注意力机制CPCA

YOLO11中添加先验卷积注意力机制CAPA

A1983Z的博客 2375

Android12 WIFI 无法提供互联网连接

ConnectivityService是Android系统中负责处理网络连接的服务之一。它负责管理设备的网络连接状态,包括Wi-Fi、移动数据、蓝牙等。Android12 中的Wifi连接, 单无法提供互联网连接修改记录

ansondroider的博客 3045

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

(一百六十一)Android P WifiStateMachine中的NetworkFactory

目录 1.回顾 2. NetworkFactory简介 2.1构造函数 2.2 setScoreFilter 2.3 register 2.4 看下NetworkRequests哪里来的 2.5evalRequest 3.总结 1.回顾 case CMD_START_CONNECT: /* co...

JT的专栏 1910

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android 11 Wifi之ConnectivityService流程

framework wifi 之ConnectivityService

TSK_Amine的博客 2420

Android多APN同时工作原理分析

平台:android5.1 场景:客户使用运营商的流量卡,希望多路APN同时工作。 时间:2016.7.1了解了Mms的机制,发现其发送彩信时,使用的是另一路APN。因此以此为追踪入口。 MmsNetworkManager.java >>>connectivityManager.requestNetwork( mNetworkRequest, mNet

a87636764的专栏 1万+

Android 7系统网络(五)Framework层(上)—ConnectivityService核心机制

ConnectivityService 是 Framework 层最核心的网络服务,负责管理系统中所有网络连接的状态。如果把 Android 网络比作一座城市,ConnectivityService 就是交通调度中心——它决定哪个网络是"默认网络"、何时切换网络、如何处理应用的网络请求。源码路径职责说明管理 NetworkAgent维护所有活跃网络连接(WiFi、移动数据、以太网等)的代理评分与选择比较各网络的评分,决定默认网络处理 NetworkRequest应用请求特定类型网络时的分配。

AfinalStone的专栏 220

Android 网络管家ConnectivityManager

Android提供了多种网络与数据传输通道,最常见的是WIFI和移动基站通信(Cellular),同时Android还可以将终端本身作为热点(Wifi Access Point),也可通过WIFI进行将两个终端直接进行连接,从而交互数据;同时还可利用蓝牙将WIFI作为数据热点对外提供数据热点,为其他设备提供网络接入。对于移动通信,不同的运营商提供了不同的服务,网络提供的服务能力也各不相同。那么,An

wzn2119的专栏 2万+
上一篇: APN---Telephony data Part I
下一篇: SystemUI---RAT
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值