Android11 有线网和wifi优先级设置

简介: Android11 有线网和wifi优先级设置

一、优先级基本知识介绍

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

系统默认分值:
 
SIM卡网络  50
wifi网络   60
有线网络   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方法是评分的主要判断逻辑

 
    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


目录
相关文章
|
24天前
|
Android开发 开发者
Android设置View是否可用
在Android开发中,有时需要将布局设置为不可点击状态(失去焦点)。常见的解决方法是使用`setOnClickListener(null)`,但本文介绍一种更通用的方式:通过封装`setViewEnabled`方法实现。该方法可递归设置View及其子View的启用状态,支持传入目标View和布尔值(`true`为可用,`false`为禁用)。例如,调用`setViewEnabled(edittext, false)`即可禁用EditText。文章附有源码及示例动图,帮助开发者快速理解与应用。
|
24天前
|
Android开发 开发者
Android中Dialog位置+样式的设置
本文介绍了在Android开发中如何设置Dialog的位置和样式。通过自定义`MyDialog`类,可以灵活调整Dialog的显示位置,例如将其固定在屏幕底部,并设置宽度匹配父布局。同时,文章还展示了如何模仿Android原生Dialog样式,通过定义`MyDialogStyle`去除标题栏、设置背景透明度、添加阴影效果以及配置点击外部关闭等功能,从而实现更加美观和符合需求的Dialog效果。代码示例详细,便于开发者快速上手实现。
|
10月前
|
XML API Android开发
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
本文介绍了如何使用androidx.preference库快速创建具有一级和二级菜单的Android设置界面的步骤和示例代码。
319 1
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
|
9月前
|
Android开发
Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
本文介绍了 `SpannableString` 在 Android 开发中的强大功能,包括如何在单个字符串中应用多种样式,如颜色、字体大小、风格等,并提供了详细代码示例,展示如何设置文本颜色、添加点击事件等,助你实现丰富文本效果。
613 3
|
9月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
338 0
|
10月前
|
开发工具 Android开发
Android项目架构设计问题之外部客户方便地设置回调如何解决
Android项目架构设计问题之外部客户方便地设置回调如何解决
57 0
|
10月前
|
数据可视化 Java 数据挖掘
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
83 0
|
Android开发
【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 效果展示 | 源码资源 )(一)
【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 效果展示 | 源码资源 )(一)
567 0
|
17天前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
43 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
3月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
582 76