Android11 实现有线网络和wifi共存

这篇具有很好参考价值的文章主要介绍了Android11 实现有线网络和wifi共存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android11 实现有线网络和wifi共存

一、前言

Android 系统Framework进行一定适配后,可以实现wifi和有线网络端口都打开的,
进而在App端即可实现通过代码控制选择使用wifi或者有线网络进行网络请求。

本文只介绍wifi和有线网络端口同时打开的实现,app代码请求特定网络另外文章介绍。

Android 默认是只保留打开一个网络的,其他网络是关闭的;
手机一般是wifi或者Sim卡;
一些的定制设备,比如商显大屏或者Android盒子,一般是wifi或者有线网络(以太网)。

Android 系统6以后网络切换是以Score分值进行判断,分值越高越优先,
比如wifi的分值为60,Sim卡的分值为50,所以wifi连接成功后,优先使用的是wifi网络。
有线网的分值为70,比wifi优先。

这个Score根据不同系统版本和设备情况,Score分值会有不同,但是都是根据分值确定确定优先级的。

优先级的判断主要在 NetworkFactory.java和它的子类WifiNetworkFactory.java、EthernetNetworkFactory.java
网络的切换逻辑判断主要在ConnectivityService.java类

不同的系统版本位置不一样,需要在自己代码环境中查找
find . -name “NetworkFactory.java”

二、实现有线网络和wifi共存

看了很多网上的方法,都不能生效,估计是Android11 代码结构有修改。

方式1:修改 ConnectivityService.java

对比了下Android9和Android11的 ConnectivityService.java ,发现变化很大,逻辑变得复制了很多。

找了很多网上的方法说是把 teardownUnneededNetwork方法的nai.asyncChannel.disconnect()注释掉就可以了;
frameworks\base\services\core\java\com\android\server\ConnectivityService.java

    private void teardownUnneededNetwork(NetworkAgentInfo nai) {
        if (nai.numRequestNetworkRequests() != 0) {
            for (int i = 0; i < nai.numNetworkRequests(); i++) {
                NetworkRequest nr = nai.requestAt(i);
                // Ignore listening requests.
                if (nr.isListen()) continue;
                loge("Dead network still had at least " + nr);
                break;
            }
        }
        //nai.asyncChannel.disconnect();
    }

但是我试了一下,在Android11 不行哎,
搜索发现 ConnectivityService.java里面还有两个 nai.asyncChannel.disconnect(),把这两个都注释掉就可以了。

研究过网络请求和释放,会知道网络的最终执行都是在NetworkFactory和相关子类;
所以在NetworkFactory.java把网络释放注释掉是最保险的。
因为在ConnectivityService到NetworkFactory直接还有很多相关的代理对象和过程。

方式2:修改 NetworkFactory.java

frameworks\libs\net\common\src_servicescommon\android\net\NetworkFactory.java


    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)) { //1、要确保执行到needNetworkFor方法一次,才能正常请求网络,shouldNeedNetworkFor方法根据情况进行修改,或者直接返回true;
            if (VDBG) log("  needNetworkFor");
            needNetworkFor(n.request, n.score);
            n.requested = true;
        } else if (shouldReleaseNetworkFor(n)) {
            if (VDBG) log("  releaseNetworkFor");
            //releaseNetworkFor(n.request); //2、把执行网络释放的操作注释即可。
            //n.requested = false;
        } else {
            if (VDBG) log("  done");
        }
    }

当然这两个部分的代码都修改是没问题的。
最好也是这两部分都进行修改,避免后期连接不上的问题。
Android13 系统上虽然目录不同了,但是就要两者都改,不然有bug!

三、网络情况查看和验证

1、通过adb查看网络

主要命令:


adb shell ifconfig //查看配置信息

adb shell dumpsys connectivity  //查看连接情况,信息更详细,有Score等信息

比如adb shell ifconfig的部分信息,如下:

C:\Users\liwenzhi>adb shell ifconfig

wlan0     Link encap:Ethernet  HWaddr 20:32:33:91:23:9e  Driver usb
          inet addr:192.168.43.53  Bcast:192.168.43.255  Mask:255.255.255.0
          inet6 addr: 2409:8955:3848:1a7e:5123:75a1:44e9:d36b/64 Scope: Global
          RX bytes:89876 TX bytes:1597990

...

eth0      Link encap:Ethernet  HWaddr 02:ad:36:01:8a:3d  Driver meson8b-dwmac
          inet addr:192.5.1.17  Bcast:192.5.1.255  Mask:255.255.255.0
          collisions:0 txqueuelen:1000
          RX bytes:1549861 TX bytes:1983944
          Interrupt:48


C:\Users\liwenzhi>


这里wifi(wlan0)和有线网络(eth0)都存在ip,表示可以进行连接

比如adb shell dumpsys connectivity的部分信息,如下:

Active default network: 101

Current Networks:
//其中一个网络,有线网
  NetworkAgentInfo{ ni{[type: Ethernet[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: 02:ad:36:01:8a:3d, failover: false,
      available: true, roaming: false]}  network{100}  nethandle{432902426637}  lp{{InterfaceName: eth0 LinkAddresses: [ fe80::5f92:6ddf:1843:9ffa/64,192.5.1.6/24 ]    
      Requests: REQUEST:0 LISTEN:3 BACKGROUND_REQUEST:0 total:3
      NetworkRequest [ LISTEN id=4, [ Capabilities: FOREGROUND AdministratorUids: [] RequestorUid: 1000 RequestorPackageName: android] ]
      NetworkRequest [ LISTEN id=5, [ Capabilities: NOT_RESTRICTED&TRUSTED&NOT_VPN&FOREGROUND Uid: 1000 AdministratorUids: [] RequestorUid: 1000 RequestorPackageName: android] ]
      NetworkRequest [ LISTEN id=7, [ Capabilities: NOT_RESTRICTED&TRUSTED&NOT_VPN Uid: 1000 AdministratorUids: [] RequestorUid: 1000 RequestorPackageName: android] ]
    Lingered: //之前的请求信息(不是当前的)
      NetworkRequest [ REQUEST id=1, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN AdministratorUids: [] RequestorUid: 1000 RequestorPackageName: android] ], expires 24995ms
      NetworkRequest [ TRACK_DEFAULT id=8, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED Uid: 1000 AdministratorUids: [] RequestorUid: 1000 RequestorPackageName: android] ], expires 24995ms

//另一个网络,wifi
  NetworkAgentInfo{ ni{[type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: , failover: false,
      available: true, roaming: false]}  network{101}  nethandle{437197393933}  lp{{InterfaceName: wlan0 LinkAddresses: [ fe80::bbbb:2be7:6b3f:67da/64,192.5.1.27/24 ] DnsAddresses: [ /192.5.1.1 ]     
      Requests: REQUEST:2 LISTEN:8 BACKGROUND_REQUEST:0 total:10
      NetworkRequest [ REQUEST id=1, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN AdministratorUids: [] RequestorUid: 1000 RequestorPackageName: android] ]
      NetworkRequest [ LISTEN id=4, [ Capabilities: FOREGROUND AdministratorUids: [] RequestorUid: 1000 RequestorPackageName: android] ]
      NetworkRequest [ LISTEN id=5, [ Capabilities: NOT_RESTRICTED&TRUSTED&NOT_VPN&FOREGROUND Uid: 1000 AdministratorUids: [] RequestorUid: 1000 RequestorPackageName: android] ]

NetworkAgentInfo 表示一个网络

像上面这种情况,默认使用的是wifi网络;
如果wifi和有线网络不在同一个网段的情况,
可以在adb shell里面直接ping通连接通同一个wifi网段的其他ip,但是ping不通同一个有线网络网段的ip;

但是可以通过指定网络端口进行连接 ping -I NetName ip

2、通过ping 命令查看网络是否连通

主要命令:

adb shell
//使用wifi 网络访问某个网址
ping -I wlan0 XXX.XXX.XXX.XXX
//使用有线网网络访问某个网址
ping -I eht0 XXX.XX.XXX.XXX

有线网和wifi可以一个连接局域网,一个连接手机热点网络
或者一个连接内网,一个连接VPN网络。

https://ip.bczs.net 网址可以查询国外网址的ip

比如浏览器输入:

https://ip.bczs.net/www.youtube.com

网页就会显示:

您查询的 域名:www.youtube.com --> 142.250.204.110
所属国家/地区:美国(US)
路由信息:142.250.204.0/24
区域号码:AS15169
区域名称:GOOGLE
描述信息:

比如这里测试,有线网eth0 接入的是公司内网,wifi连接的是VPN路由器网络:

130|console:/ # 
130|console:/ #  //有线网 测试连接 YouTube,无法连通
130|console:/ # ping -I eth0 172.217.24.78                                     
PING 172.217.24.78 (172.217.24.78) from 192.168.31.71 eth0: 56(84) bytes of data.


^C
--- 172.217.24.78 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4054ms

1|console:/ # 
1|console:/ # //vpn wifi 测试连接 YouTube,正常连通
1|console:/ # ping -I wlan0 172.217.24.78                                      
PING 172.217.24.78 (172.217.24.78) from 192.5.1.8 wlan0: 56(84) bytes of data.
64 bytes from 172.217.24.78: icmp_seq=1 ttl=53 time=134 ms
64 bytes from 172.217.24.78: icmp_seq=2 ttl=53 time=27.5 ms
64 bytes from 172.217.24.78: icmp_seq=3 ttl=53 time=46.5 ms
64 bytes from 172.217.24.78: icmp_seq=4 ttl=53 time=41.0 ms
64 bytes from 172.217.24.78: icmp_seq=5 ttl=53 time=29.3 ms
^C
--- 172.217.24.78 ping statistics ---
130|console:/ # ^C
130|console:/ # ping -I wlan0 www.baidu.com    //vpn wifi 测试连接 baidu,正常连通                                 
PING www.a.shifen.com (157.148.69.74) from 192.5.1.8 wlan0: 56(84) bytes of data.
64 bytes from 157.148.69.74: icmp_seq=1 ttl=41 time=132 ms
64 bytes from 157.148.69.74: icmp_seq=2 ttl=41 time=103 ms
64 bytes from 157.148.69.74: icmp_seq=3 ttl=41 time=113 ms
^C
--- www.a.shifen.com ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6004ms
rtt min/avg/max/mdev = 84.540/107.435/132.974/13.661 ms
console:/ # 
console:/ # 
console:/ # ping -I eth0 www.baidu.com   //有线网 测试连接baidu,正常连通                                      
PING www.a.shifen.com (157.148.69.74) from 192.168.31.71 eth0: 56(84) bytes of data.
64 bytes from 157.148.69.74: icmp_seq=1 ttl=48 time=14.2 ms
64 bytes from 157.148.69.74: icmp_seq=2 ttl=48 time=13.5 ms
64 bytes from 157.148.69.74: icmp_seq=3 ttl=48 time=13.6 ms
64 bytes from 157.148.69.74: icmp_seq=4 ttl=48 time=13.6 ms
^C
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 13.511/13.768/14.231/0.309 ms
console:/ # 

可以看到连接VPN网络的wifi 是可以正常访问外网,公司内网无法访问外网!百度网页是内网和外网都可以正常联通的。
证明有线网和wifi 是有区分的,并且都是可以正常访问外部和被外部访问的。文章来源地址https://www.toymoban.com/news/detail-723546.html

到了这里,关于Android11 实现有线网络和wifi共存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ThinkPad中有线网无法使用Access Connections创建共享热点的解决方法图解

    使用Think自带的ThinkVantage Access Connections中的mobilehotspot功能创建热点,使用无线创建热点正常,在mobilehotspot模块中可以正常点击开始进行创建,但要使用有线网络接入进行共享创建热点,发现点击mobilehotspot模块中的开始按钮,呈现灰色不可选状态,导致无法创建热点。 解决方

    2024年02月06日
    浏览(52)
  • rk3399 android以太网和wifi共存

    1.修改 frameworks/base/core/java/android/net/NetworkFactory.java evalRequest 方法 注释两行 2.修改frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java文件修改 NETWORK_SCORE=30  降低优先级 这样以太网和wifi都能连接成功 frameworksoptnetethernetjavacomandroidserverethernetEthernetNetwork

    2024年02月09日
    浏览(52)
  • 无线网卡报错:windows仍在设置此设备的类配置(代码56)解决window11 无wifi按钮\无法连接有线网络问题

    这种情况是虚拟机VMware的原因,根据下面方法做即可 可能也有驱动本身的问题,本篇只解决此类型报错,如遇其他情况请另行查找。 1、在设备管理器中找到网络适配器一栏,可以看到wifi网卡(我这是 Inter(R)Wi-Fi 6 AX201 160MHz)或者有线网卡(Realtek Pcie Gbe Family Controller)前面有

    2024年02月11日
    浏览(49)
  • Android 11.0 SystemUI 去掉状态栏wifi流量上下行图标功能实现

      在11.0系统定制rom开发中,在关于systemui的定制功能总,在SystemUI 状态栏上显示时钟,电池电量 wifi图标,在显示wifi图标时,网络实时更新时,但是会时不时显示上下行图标 显得很不美观,客户需求要求不显示上下行图标,所以需要去掉上下行图标功能,接下来实现相关功能开

    2024年02月04日
    浏览(60)
  • Android11 Wifi开启、扫描和连接

    开启Wifi开关,Wifi开关是 WifiEnabler , WifiEnabler 实现了 SwitchWidgetController.OnSwitchChangeListener 监听,打开/关闭开关会回调至 mWifiManager.setWifiEnabled(isChecked) 用于根据Switch控件的当前状态关闭或打开Wi-Fi。 在 onCheckedChanged 方法的开始部分使用了一个 mStateMachineEvent 变量,当该变量为

    2024年02月07日
    浏览(47)
  • Android11 Wifi Mac地址设置随机或者固定分析

    本文对Android11 wifi MAC地址设置是否随机问题进行分析。 Android 8.0 开始,设备开始支持Wifi 随机MAC,说是为了安全。 很多手上也能看到Wifi 默认使用的是随机MAC地址。 但是有些情况下,需要固定MAC,比如有些OTA升级用的是Wifi MAC地址,这时候就要MAC固定。 所以有必要对设备 W

    2023年04月16日
    浏览(54)
  • 小度WiFi怎么连接?怎么切换为无线网模式?

    小度WiFi安装后,默认工作模式为无线WiFi热点模式,如果你电脑没有连接网线,就需要把小度WiFi转换为无线网卡接收信号,那怎么切换小度WiFi的工作模式呢,切换为无线网卡模式,又是怎么连接上网呢? 1、确认小度WiFi好驱动,能够正常工作的情况下,右键小度WiFi托盘栏的图标,弹出

    2024年02月08日
    浏览(45)
  • 无线网信号救星 小米WiFi放大器0元公测

    两天前,小米路由器已经开始预告7月22日(今天)将会有大事发生,不少人都认为这应该是要发布路由器新品的节奏,究竟是什么鬼?今天早上10点,小米终于是为我们揭晓了答案。 万万没想到的是,小米给出的答案居然跟此前大家预测的相差这么大,此次要发布的产品并非

    2024年02月08日
    浏览(42)
  • 关于无线网WiFi的安全使用和设置的建议与注意

    随着电子市场上笔记本电脑、ipad、智能手机等潮流的盛行,Wi-Fi上网现在在中国已经非常普及。他让用户无论何时何地,都能够使用以上支持Wi-Fi功能的移动设备上网。这在方便了用户的同时,也引发了专家对其安全和隐私的担忧。下面和大家分享关于WiFi安全使用和设置的建

    2024年02月05日
    浏览(38)
  • RK3288 Android11 RTL8723DS WiFi 和 蓝牙Bluetooth 适配

      瑞芯微RK系列对“REALTEK瑞昱公司”的wifi、蓝牙双模的模组都有内置适配的,因此HAL层、Framework层、协议栈及库文件都不需要移植适配,只需修改设备树和一些配置文件即可。 补充: RTL8723DS时钟输入源讲解   RTL8723DS模组的第24号引脚是模组的时钟输入源,需要给此提供

    2024年02月07日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包