• Android11 有线网和wifi优先级设置


    一、优先级基本知识介绍

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

    系统默认分值:

    1. SIM卡网络 50
    2. wifi网络 60
    3. 有线网络 70

    手机网络设置都有自己的Factory设置类,都继承自NetworkFactory.java
    wifi网络设置类:WifiNetworkFactory.java packages/modules/Wifi/service/java/com/android/server/wifi/WifiNetworkFactory.java
    有线网络设置类:EthernetNetworkFactory.java frameworks\opt\net\ethernet\java\com\android\server\ethernet\EthernetNetworkFactory.java

    移动网络设置类:TelephonyNetworkFactory.java

    frameworks\opt\telephony\src\java\com\android\internal\telephony\dataconnection\TelephonyNetworkFactory.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方法是评分的主要判断逻辑

    1. private void evalRequest(NetworkRequestInfo n) {
    2. if (VDBG) {
    3. log("evalRequest");
    4. log(" n.requests = " + n.requested);
    5. log(" n.score = " + n.score);
    6. log(" mScore = " + mScore);
    7. log(" request.providerId = " + n.providerId);
    8. log(" mProvider.id = " + mProvider.getProviderId());
    9. }
    10. if (shouldNeedNetworkFor(n)) { //通过一些属性值判断是否需要请求网络
    11. if (DBG) log(" needNetworkFor");
    12. needNetworkFor(n.request, n.score);
    13. n.requested = true;
    14. } else if (shouldReleaseNetworkFor(n)) { //通过一些属性值判断是否需要释放网络
    15. if (DBG) log(" releaseNetworkFor");
    16. releaseNetworkFor(n.request);
    17. n.requested = false;
    18. } else {
    19. if (DBG) log(" done");
    20. }
    21. }

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

    真正要使用的网络一定要经过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

  • 相关阅读:
    # [AI]多模态聚类能力助力AI完成自主意识测试
    Spring修炼之路(1)基础入门
    Python常见面试题016. 请实现如下功能|谈谈你对闭包的理解
    ONVIF学习笔记11:搜索设备不匹配问题排查
    短视频创作,主动变现和被动变现方式详解,建议收藏反复阅读-下
    Redis 搭建高可用集群
    优雅草蜻蜓z系统暗影版前台崩溃,后台提示:系统接口异常502,java项目管理yyc-admin后台管理系统服务无法启动的解决方案
    Stable Diffussion和MJ的详细对比
    【word技巧】ABCD选项如何对齐?
    CentOS7安装MySQL8
  • 原文地址:https://blog.csdn.net/xiaowang_lj/article/details/132694546