Android11 有线网和wifi优先级设置

63 篇文章 3 订阅
41 篇文章 5 订阅

Android11 有线网和wifi优先级设置

一、优先级基本知识介绍

Android6.0之后系统中优先级设置都是根据Score分值来设置优先级,分值0-100,数值越高,越优先。

系统默认分值:

SIM卡网络  50
wifi网络   60
有线网络   70

手机网络设置都有自己的Factory设置类,都继承自NetworkFactory.java
wifi网络设置类:WifiNetworkFactory.java
有线网络设置类:EthernetNetworkFactory.java

NetworkFactory的子类都有NETWORK_SCORE常量,表示该网络的分值。

二、有线网络优先级设置

1、在Android9.0设置有线网络优先级直接修改EthernetNetworkFactory.java的 NETWORK_SCORE 值就行

private final static int NETWORK_SCORE = 55; //change score from 70

但是我Android11 的代码修改后发现并不能生效,还是有线网优先。
研究了一下EthernetNetworkFactory.java和ConnectivityService.java发现里面的逻辑有很大的修改。

2、在Android11 修改有线网络优先级

找到EthernetNetworkFactory.java的getNetworkScore()方法,这里面返回的score才是有线网的有效分值;

这个getNetworkScore()方法是在Android11 新增的。

在该方法返回NETWORK_SCORE值即可。里面很多判断是没啥用的。

如果要wifi优先级高于有线,一定要设置有线网络的分值比wifi小,在后期测试过程中发现在某些情况,wifi的分值会变成20,把有线网络分值设置成15才生效。

adb是可以进行分值查看的,文章最后有描述。

三、网络优先级简单刨析

参考:

Framework中的连接管理机制: https://blog.csdn.net/u010961631/article/details/48629601

网络连接评分机制之NetworkFactory: https://blog.csdn.net/u010961631/article/details/48971431

网络连接评分机制之NetworkAgent: https://blog.csdn.net/u010961631/article/details/48971651

Android网络优先级及更改: https://blog.csdn.net/u013686019/article/details/51447129/

网上的代码都比较旧了,只能做思路参考,里面有些方法不一样了。

1、网络切换的主要逻辑都是在 ConnectivityService.java里面

ConnectivityService.java和WMS、AMS一样,都是在System_server里面启动的;

ConnectivityService.java里面会对NetworkFactory的网络连接子类进行保存和管理。

Android11 ConnectivityService
新增了NetworkProviderInfo是一个内部类,但是以前的NetworkAgentInfo还保留了;

2、优先级评分逻辑主要在evalRequest方法

NetworkFactory.java的evalRequest方法是评分的主要判断逻辑


    private void evalRequest(NetworkRequestInfo n) {

        if (VDBG) {
            log("evalRequest");
            log(" n.requests = " + n.requested);
            log(" n.score = " + n.score);
            log(" mScore = " + mScore);
            log(" request.providerId = " + n.providerId);
            log(" mProvider.id = " + mProvider.getProviderId());
        }

        if (shouldNeedNetworkFor(n)) { //通过一些属性值判断是否需要请求网络
            if (DBG) log("  needNetworkFor");
            needNetworkFor(n.request, n.score);
            n.requested = true;
        } else if (shouldReleaseNetworkFor(n)) { //通过一些属性值判断是否需要释放网络
            if (DBG) log("  releaseNetworkFor");
            releaseNetworkFor(n.request);
            n.requested = false;
        } else {
            if (DBG) log("  done");
        }
    }

具体情况和释放网络的操作都是在子类中进行实现的。

真正要使用的网络一定要经过needNetworkFor这个方法。

可以多添加有一些日志确定是否执行某个方法。

3、要理解这个网络连接的具体流程要清楚几个东西

(1)NetworkFactory.java

相关的子类:WifiNetworkFactory、EthernetNetworkFactory
内部类:NetworkRequestInfo

(2)ConnectivityService.java

内部类:NetworkProviderInfo

####(3)Handler

Messenger对象的理解,不是Message对象哦

因为NetworkFactory是继承自Handler,

并且很多消息的发送接收都是通过Messenger对象进行的;

(4)其他

NetworkRequest 网络请求对象

NetworkAgent 网络代理对象,在EthernetNetworkFactory中有创建

NetworkAgentInfo 网络代理封装对象,在ConnectivityService中创建

消息的传送都是通过Messenger,ConnectivityService–》NetworkAgentInfo–》NetworkAgent–》具体的Factory

Network 网络对象,被包含在网络代理对象里面

EthernetNetworkFactory.NetworkInterfaceState.start()–>new NetworkAgent
Vpn.agentConnect()–>new NetworkAgent

NetworkAgent.register()–>

ConnectivityManager.registerNetworkAgent–>

ConnectivityService.registerNetworkAgent–>new NetworkAgentInfo

如果要查看当前网络对应的Score,
可以通过adb shell dumpsys connectivity,里面的Current Networks有很多相关的数据信息,前提是要先连接上对应的网络。

adb 查看分析网络情况详解:
https://blog.csdn.net/wenzhi20102321/article/details/122161589

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值