Android 网络 --framework层面 -one

Android 网络 --framework层面 -one

Android 网络 fwk 层面的是一个比较大的话题,文章"无微不至"基本是不可能的,遵从一般的学习思路,抓住"主干", 剩下的就是撸代码了

白话Android网络

Android 有几种网络类型.常见的 wifi 和 data(数据网络), 每种网络类型获取网络能力的过程或者说链路层实现肯定是不同的,比如:“数据网络需要插入sim卡,打开数据网络” , 而 wifi 网络 则需要打开wifi 连接(关联)具有网络能力的无线接入点; 那对应代码中,实现的实体(或者说类)也是不同的.

思考一个问题: 那wifi 和 data 网络同时打开时候使用哪个网络呢? 或者说哪个为默认网络呢 ? 这一点从日常使用,我们肯定知道,使用的是wifi网络. Android 系统是如何做到呢? 是根据网络类型? 还是根据其他的?

Android 系统对所有的网络类型"一视同仁" ,选用哪个网络,严格讲是根据网络实体的current score ,哪个分数高,哪个就是默认网络,不同网络实体有不同基础分数, wifi 是60分, 数据网络是 50分, 但是这个分数不是一直不变的,有很多因素会导致分数的变化;在日常中,我们肯定遇到当wifi信号很弱的时候,导致android 手机使用了数据网络, 原因是信号(rssi)变动会导致wifi分数的变化,(对于wifi不会超过60一种情况除外,用户显式选择网络explicitlySelected=true,此时score 为 100分), 当信号低于一定值下,导致分数低于50,此时便会使用数据网络(switch default network).

在一种场景下,wifi信号低导致切换到数据网络,会有一个小bug; 如果wifi信号在某个信号区间下,导致wifi分数在50分左右徘徊,这显然会导致 wifi 和 data 来回切换,用户体验不是特别好; 这个问题,个人愚见,是网络的切换没有"滞回性" 或者说不同方向切换网络分数是同一个分数 ; 一种解决方法,是一旦切换到数据网络情况下,wifi分数高于55 后再切换到wifi网络,这样就能避免来回切换的问题.(不知道google以后会不会解决)

关于"滞回性", 生活中场景还是很多的,比如我们车子从7挡降低到6挡位的速度,肯定是和从6档升至7档 速度不同,要不然在某个速度情况下,会出现档位的来回切换-------题外话~~~

行话android网络

上面写到,不同的网络对应不同的网络实体 对应到代码是核心实现类是不同的, wifi 核心逻辑类对应是WifiStateMachine.java 数据网络核心逻辑类对应是 DcTracker.java DataConnection.java ; 上面还写到Android 默认网络选择的规则,那这个规则是谁来完成呢,"粉墨登场"android 的网络大管家 ConnectivityService.java ,这个类是android 网络fwk层核心类,复杂程度就不言而喻了!!

引入一个问题: 网络实体和网络大管家肯定是有"业务来网",who去负责呢? 在android 中NetworkAgent.java 负责这个事情;网络实体把自己和网络大管家的"业务来往"放在NetworkAgent中统一处理!!(代理模式) ,另外, 这个NetworkAgent 在 ConnectivityService 中有对应NetworkAgentInfo, 从ConnectivityService角度看它代表一种网络能力,是一个网络实体。

明确一点,NetworkAgent 是在某种类型网络建立起来的才会去创建的,具体对应 wifi 是在L2connected状态(关联4次握手成功)构造对象; 数据网络是在进入DcActiveState 状态(拨号成功)构造对象,这个很好理解,网络没有建立,肯定不需要agent了

引入一个情景,如果一个app要通过网络大管家去申请一个网络(requestNetwork) , 网络大管家此时发现没有一个网络满足的,那这个大管家怎么去构建这个网络呢? 答案是"NetworkFactory" 望名知义,生产网络的工厂, 当然这个工厂还是有区分的,比如数据网络的工厂TelephonyNetworkFactory,WiFi网络的WifiNetworkFactory

继续app申请网络的情景,大管家发现现有的网络(NetworkAgentInfo)没有一个满足要求的,此时,因为大管家也不知道哪种类型网络满足这个requestNetwork,就会把这个requestNetwork 发送给各个NetworkFactory,满足的NetworkFactory会尝试建立一个网络连接,这个网络连接对应于网络大管家(ConnectivityService)就是一个NetworkAgentInfo; 对于这个构造过程因网络类型不同,数据网络就是去就拨号连接网络(setupData), 而wifi则是通过启动WifiConnectivityManager的连接扫描,只有扫描才有可能去连接网络嘛!!

总结

关于上面一些细节的地方,会在以后的文章里面继续去分析说明下; 最后说下,把握"主干",剩下就去撸源码吧!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值