【私人备忘录】Android P 数据业务开启代码流程(二)

ConnectivityService的工作总结起来就是:通过WIFI,移动数据业务,热点,VPN 等方式来获取路由配置信息。无论通过哪种方式,获取到路由配置信息后,需要交给ConnectivityService来处理,ConnectivityService通过ping网络来检查网络的有效性,进而影响到各个数据业务方式的评分值,ConnectivityService通过这些评分值来决定以哪个数据业务方式连接网络。决定好数据业务方式后,把这些路由配置信息设置到网络物理设备中。大概代码流程上一篇第七点中有介绍。再来看下ConnectivityService中的几个关键类和补充一些代码细节:
一、NetworkMonitor(网络有效性检测):
1、ConnectivityManager.registerNetworkAgent(new NetworkAgentInfo) → NetworkAgentInfo.NetworkAgentInfo(networkMonitor = mConnService.createNetworkMonitor) → ConnectivityManager.createNetworkMonitor(new NetworkMonitor)
2、ConnectivityService. rematchNetworkAndRequests() → updateLingerState(nai.unlinger/linger) 
3、ConnectivityService.updateNetworkInfo() → networkAgent.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED) → NetworkMonitor.DefaultState → NetworkMonitor.EvaluatingState(probeResult = isCaptivePortal()) → NetworkMonitor.isCaptivePortal → sendParallelHttpProbes() → NetworkMonitor.EvaluatingPrivateDnsState → NetworkMonitor.ValidatedState → ConnectivityService(case NetworkMonitor.EVENT_NETWORK_TESTED)接下去更新分数上一篇已经介绍
二、NetworkFactory(处理NetworkRequest):
1、TelephonyNetworkFactory(setScoreFilter(TELEPHONY_NETWORK_SCORE)) → NetworkFactory.register() → ConnectivityService.registerNetworkFactory
2、ConnectivityService.sendUpdatedScoreToFactories → NetworkFactory.handleAddRequest(evalRequest(n)) → needNetworkFor(n.request, n.score) → TelephonyNetworkFactory.needNetworkFor(onNeedNetworkFor)
备注:
各类NetworkFactory如TelephonyNetworkFactory、BluetoothTetheringNetworkFactory、WifiNetworkFactory负责处理对应的NetworkRequest。当ConnectivityService收到NetworkRequest后, 通过匹配NetworkRequest要求的网络能力及各种NetworkFactory提供的网络能力,就能判断出NetworkRequest应该交给哪个NetworkFactory处理
三、NetworkAgent(路由配置信息):
1、ConnectivityService.updateNetworkInfo() → networkAgent.networkMonitor.sendMessage,NetworkAgent在注册到ConnectivityManager就可以和ConnectivityManager搞来搞去,具体代码上一篇已经讲过
备注:
当建立网络成功后,框架内就会创建出符合该网络类型的NetworkAgent,同一个NetworkFactory可以在不同的时刻根据需要创建不同的NetworkAgent,并将NetworkAgent注册到ConnectivityService中。 例如,数据业务拨号成功后,就会创建出DcNetworkAgent。
四、Netd(网络物理端口设置):
主要代码:
1、system/netd
2、system/core/libsysutils/src
3、system/core/include/sysutils
4、framework/base/services/java/com/android/server
备注:Network Daemon,Network守护进程,负责跟一些设计物理端口的网络操作相关的功能实现。

发布了15 篇原创文章 · 获赞 107 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/llleahdizon/article/details/89850272