Android13 实现有线网络和wifi共存

Android13 实现有线网络和wifi共存

文章目录

  • Android13 实现有线网络和wifi共存
    • 一、前言
    • 二、修改代码:
      • 1、ConnectivityService.java
      • 2、NetworkFactoryImpl.java
      • 3、Android11 和Android13 修改代码目录对比:
      • 4、如果只修改部分代码的后果
          • 只修改 ConnectivityService.java,不修改 NetworkFactoryImpl.java 的情况
          • 只修改 NetworkFactoryImpl.java,不修改 ConnectivityService.java 的情况
    • 三、网络共存验证
      • 1、窗口命令查看
        • (1)ifconfig
        • (2)ping -I 节点名称 ip/url
        • (3)dumpsys connectivity
      • 2、代码查看

一、前言

Android一些的定制设备,比如商显大屏或者Android盒子,一般是wifi或者有线网络。
Android 系统Framework进行一定适配后,可以实现wifi和有线网络端口都打开的,
进而在App端即可实现通过代码控制选择使用wifi或者有线网络进行网络请求。

Android11 上Wifi和有线网共存,已经有介绍:
https://blog.csdn.net/wenzhi20102321/article/details/133913924

Android13 上代码有较大差别,这里也进行记录和介绍。

二、修改代码:

Android13下面两个代码都要修改,不然会有点bug!

1、ConnectivityService.java

packages\modules\Connectivity\service\src\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 and track default requests.if (!nr.isRequest()) continue;loge("Dead network still had at least " + nr);break;}}loge("no to disconnect! ");//mychange//nai.disconnect();}

ConnectivityService.java 里面还有一个地方,有调用 nai.disconnect(),最后也注释掉。

2、NetworkFactoryImpl.java

frameworks\libs\net\common\device\android\net\NetworkFactoryImpl.java

    private void handleRemoveRequest(NetworkRequest request) {NetworkRequestInfo n = mNetworkRequests.get(request);mParent.log("  handleRemoveRequest  no do !"); //mychangeif (n != null) {//mNetworkRequests.remove(request);//if (n.requested) mParent.releaseNetworkFor(n.request);}}

最好是添加一个prop属性,记忆是否释放网络,方便手动修改和调试,类似下面的代码:

import android.os.SystemProperties;boolean isReleaseNetwork = SystemProperties.getBoolean("persist.demo.release_network", false);Log.e(TAG, "disconnect isReleaseNetwork = " + isReleaseNetwork);if (!isReleaseNetwork) {return;}

两个地方都加上属性判断

3、Android11 和Android13 修改代码目录对比:

文件修改目录:

//Android11
frameworks\base\services\core\java\com\android\server\ConnectivityService.java
frameworks\libs\net\common\src_servicescommon\android\net\NetworkFactory.java//Android13
packages\modules\Connectivity\service\src\com\android\server\ConnectivityService.java
frameworks\libs\net\common\device\android\net\NetworkFactoryImpl.java

可以看到里面的代码目录完全不一样的;
并且里面的代码实现也是有非常大的差异!有兴趣的可以自己研究看看。

4、如果只修改部分代码的后果

这里只说Android13 是上的,Android11 的比较久没动了,记不清了!

只修改 ConnectivityService.java,不修改 NetworkFactoryImpl.java 的情况

刚开始是可以同时连接上的,但是你发现断开后,无法再连接上wifi!
因为相关请求已经被移除了,低优先级的网络无法再重新连接!
具体为啥无法再连接,没有进一步具体分析,有兴趣的可以去看看。

只修改 NetworkFactoryImpl.java,不修改 ConnectivityService.java 的情况

Wifi和有线网是可以同时连接的,但是Wifi会每过几秒就会断开重连!

从日志看有 ConnectivityService 和 NetworkAgent 的相关日志

10-18 15:18:49.999   636   802 D ConnectivityService: handleLingerComplete for [143 WIFI]
10-18 15:18:50.000   636   794 D WifiNetworkAgent: NetworkAgent: NetworkAgent channel lost //网络断开的关键
10-18 15:18:50.000   636   802 D ConnectivityService: [143 WIFI] disconnected, was satisfying 10

每几秒重复一次上面的日志

如果你在 ConnectivityService.teardownUnneededNetwork 方法添加日志,发现会执行到 nai.disconnect();

所以循环断开是系统流程里面导致的。具体哪里开始的,可以基于日志分析,这里不展开介绍。

三、网络共存验证

1、窗口命令查看

(1)ifconfig

图片:
在这里插入图片描述

内容:

console:/ # 
console:/ # ifconfig
lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0 inet6 addr: ::1/128 Scope: HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:33 errors:0 dropped:0 overruns:0 frame:0 TX packets:33 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2898 TX bytes:2898 eth0      Link encap:Ethernet  HWaddr 42:6b:39:d7:49:75  Driver rk_gmac-dwmacinet addr:192.168.31.174  Bcast:192.168.31.255  Mask:255.255.255.0 inet6 addr: fe80::42ff:4f65:13fe:20fa/64 Scope: LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:558 errors:0 dropped:0 overruns:0 frame:0 TX packets:135 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:40961 TX bytes:20403 Interrupt:78 wlan0     Link encap:Ethernet  HWaddr 0c:cf:89:a6:44:2a  Driver usbinet addr:192.5.1.34  Bcast:192.5.1.255  Mask:255.255.255.0 inet6 addr: fe80::2e43:706c:c30b:f9c8/64 Scope: LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:812 errors:0 dropped:0 overruns:0 frame:0 TX packets:95 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:142061 TX bytes:17362 console:/ # 

可以看到 wlan0 和 eth0 都是存在ip地址的。

(2)ping -I 节点名称 ip/url

测试通过节点对应的网络访问某个ip

130|console:/ # 
130|console:/ # ping wwwbaidu.com
PING wwwbaidu.com (45.194.224.35) 56(84) bytes of data.
64 bytes from 45.194.224.35: icmp_seq=1 ttl=43 time=13.6 ms
64 bytes from 45.194.224.35: icmp_seq=2 ttl=43 time=13.4 ms
64 bytes from 45.194.224.35: icmp_seq=3 ttl=43 time=38.7 ms
64 bytes from 45.194.224.35: icmp_seq=4 ttl=43 time=13.5 ms
^C
--- wwwbaidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 13.452/19.851/38.744/10.908 ms
console:/ # 
console:/ # 
console:/ # ping -I eth0 www.baidu.com
PING www.a.shifen.com (157.148.69.80) from 192.168.31.174 eth0: 56(84) bytes of data.
64 bytes from 157.148.69.80: icmp_seq=1 ttl=46 time=15.0 ms
64 bytes from 157.148.69.80: icmp_seq=2 ttl=46 time=14.5 ms
64 bytes from 157.148.69.80: icmp_seq=3 ttl=46 time=15.2 ms
64 bytes from 157.148.69.80: icmp_seq=4 ttl=46 time=14.6 ms
^C
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 14.580/14.877/15.257/0.294 ms
console:/ # 
console:/ # ping -I wlan0 www.baidu.com
PING www.a.shifen.com (157.148.69.80) from 192.5.1.34 wlan0: 56(84) bytes of data.
64 bytes from 157.148.69.80: icmp_seq=1 ttl=41 time=478 ms
64 bytes from 157.148.69.80: icmp_seq=2 ttl=41 time=99.9 ms
64 bytes from 157.148.69.80: icmp_seq=3 ttl=41 time=89.0 ms
64 bytes from 157.148.69.80: icmp_seq=4 ttl=41 time=96.1 ms
^C
--- www.a.shifen.com ping statistics ---
5 packets transmitted, 4 received, 20% packet loss, time 4005ms
rtt min/avg/max/mdev = 89.084/191.015/478.886/166.248 ms
console:/ # 

这里可以看到有线网和wifi都是对外正常进行通讯的。

(3)dumpsys connectivity

这里会有比较多的连接信息,主要信息如下:

console:/ # 
console:/ # 
console:/ # dumpsys connectivityCurrent Networks:
//wifi 相关信息NetworkAgentInfo{network{100}  handle{432902426637}  ni{WIFI CONNECTED extra: } Score(60 ; KeepConnected : 0 ; Policies : TRANSPORT_PRIMARY&EVER_VALIDATED_NOT_AVOIDED_WHEN_BAD&IS_UNMETERED&IS_VALIDATED)  created everValidated lastValidated  lp{{InterfaceName: wlan0 LinkAddresses: [ fe80::2e43:706c:c30b:f9c8/64,192.5.1.34/24 ] DnsAddresses: [ /192.5.1.1 ] Domains: null MTU: 0 ServerAddress: /192.5.1.1 TcpBufferSizes: 524288,1048576,2097152,262144,524288,1048576 Routes: [ fe80::/64 -> :: wlan0 mtu 0,192.5.1.0/24 -> 0.0.0.0 wlan0 mtu 0,0.0.0.0/0 -> 192.5.1.1 wlan0 mtu 0 ]}}  nc{[ Transports: WIFI Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED&NOT_VCN_MANAGED LinkUpBandwidth>=12000Kbps LinkDnBandwidth>=30000Kbps Specifier: <WifiNetworkAgentSpecifier [WifiConfiguration=, SSID="VPN", BSSID=34:f7:16:92:87:6c, band=1, mMatchLocalOnlySpecifiers=false]> TransportInfo: <SSID: "VPN", BSSID: 34:f7:16:92:87:6c, MAC: 0c:cf:89:a6:44:2a, IP: /192.5.1.34, Security type: 2, Supplicant state: COMPLETED, Wi-Fi standard: 4, RSSI: -51, Link speed: 270Mbps, Tx Link speed: 270Mbps, Max Supported Tx Link speed: 300Mbps, Rx Link speed: -1Mbps, Max Supported Rx Link speed: 300Mbps, Frequency: 2442MHz, Net ID: 0, Metered hint: false, score: 60, isUsable: true, CarrierMerged: false, SubscriptionId: -1, IsPrimary: 1, Trusted: true, Restricted: false, Ephemeral: false, OEM paid: false, OEM private: false, OSU AP: false, FQDN: <none>, Provider friendly name: <none>, Requesting package name: <none>"VPN"wpa2-pskMLO Information: , AP MLD Address: <none>, AP MLO Link Id: <none>, AP MLO Affiliated links: <none>> SignalStrength: -51 OwnerUid: 1000 AdminUids: [1000] SSID: "VPN" UnderlyingNetworks: Null]}  factorySerialNumber=6}Requests: REQUEST:0 LISTEN:9 BACKGROUND_REQUEST:0 total:9NetworkRequest [ LISTEN id=5, [ Capabilities: FOREGROUND RequestorUid: 1000 RequestorPkg: android UnderlyingNetworks: Null] ]Inactivity Timers:Nat464Xlat:<not start>
//有线网相关信息NetworkAgentInfo{network{101}  handle{437197393933}  ni{Ethernet CONNECTED extra: 42:6b:39:d7:49:75} Score(-2147483648 ; KeepConnected : 0 ; Policies : EVER_VALIDATED_NOT_AVOIDED_WHEN_BAD&IS_UNMETERED&IS_VALIDATED)  created everValidated lastValidated  lp{{InterfaceName: eth0 LinkAddresses: [ fe80::42ff:4f65:13fe:20fa/64,192.168.31.174/24 ] DnsAddresses: [ /192.168.31.1 ] Domains: null MTU: 0 ServerAddress: /192.168.31.1 TcpBufferSizes: 524288,1048576,3145728,524288,1048576,2097152 Routes: [ fe80::/64 -> :: eth0 mtu 0,192.168.31.0/24 -> 0.0.0.0 eth0 mtu 0,0.0.0.0/0 -> 192.168.31.1 eth0 mtu 0 ]}}  nc{[ Transports: ETHERNET Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED&NOT_VCN_MANAGED LinkUpBandwidth>=100000Kbps LinkDnBandwidth>=100000Kbps Specifier: <EthernetNetworkSpecifier (eth0)> UnderlyingNetworks: Null]}  factorySerialNumber=1}Requests: REQUEST:10 LISTEN:7 BACKGROUND_REQUEST:0 total:17NetworkRequest [ REQUEST id=1, [ Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&NOT_VCN_MANAGED RequestorUid: 1000 RequestorPkg: android UnderlyingNetworks: Null] ]NetworkRequest [ LISTEN id=5, [ Capabilities: FOREGROUND RequestorUid: 1000 RequestorPkg: android UnderlyingNetworks: Null] ]Inactivity Timers:Nat464Xlat:<not start>

这里可以看到 Wifi 和有线网都要相关信息和不同的ip;
这里和Android11 有个非常不同的是:Android 有线网没有 Score 值?
这里值显示的是int 的最小值。但是还是有线网优先的!
Android11 上是可以看到 Score 的值为 70,代码上明显定义的,Android13 上未定义;
所以如果Android13 上要设置优先级估计就比较麻烦了。
如果确实要做优先级,可以看 NetworkAgentInfo 对象里面的Score 值的定义线索进行分析。

2、代码查看

可以通过代码查看Wifi 和有线网的 Ip地址

//getIpAddress,第二个参数是决定是获取的wifi的ip地址还是有线网的ip地址public static String getIpAddress(Context context, boolean isGetWifiIp) {Network network = null;if (isGetWifiIp) {network = getWlanNet(context);} else {network = getFirstEthernet(context);}if (network == null) {return "";}ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);final LinkProperties linkProperties = mConnectivityManager.getLinkProperties(network);if (linkProperties != null) {for (LinkAddress linkAddress : linkProperties.getLinkAddresses()) {InetAddress inetAddress = linkAddress.getAddress();if (inetAddress instanceof Inet4Address) {return inetAddress.getHostAddress();}}}return "";}//getFirstEthernetprivate static Network getFirstEthernet(Context context) {ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);final Network[] networks = mConnectivityManager.getAllNetworks();for (final Network network : networks) {NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network);if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {return network;}}return null;}//getFirstWlanprivate static Network getWlanNet(Context context) {ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);final Network[] networks = mConnectivityManager.getAllNetworks();for (final Network network : networks) {NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network);if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {return network;}}return null;}

通过上面的代码 getIpAddress 方法,是可以分别获取到Wifi 和有线网的 Ip的!

另外,Java代码情况网络是可以指定特定网络通讯的,这里不展开介绍。

有兴趣的可以看看:
https://blog.csdn.net/wenzhi20102321/article/details/133950336

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升医院安全的关键利器——医院安全(不良)事件报告系统源码

医院是人们寻求医疗服务和康复的场所&#xff0c;安全是医院运营的基石。然而&#xff0c;医疗过程中不可避免地会出现不良事件&#xff0c;如药物错误、手术事故等。为了及时发现、评估和解决这些问题&#xff0c;医院安全&#xff08;不良&#xff09;事件报告系统应运而生。…

聊聊Android线程优化这件事

一、背景 在日常开发APP的过程中&#xff0c;难免需要使用第二方库和第三方库来帮助开发者快速实现一些功能&#xff0c;提高开发效率。但是&#xff0c;这些库也可能会给线程带来一定的压力&#xff0c;主要表现在以下几个方面&#xff1a; 线程数量增多&#xff1a;一些库可…

Android问题笔记 - 关于SuperNotCalledException报错异常信息的解决方案

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

互联网Java工程师面试题·Java 面试篇·第一弹

目录 1、Java 中能创建 volatile 数组吗&#xff1f; 2、volatile 能使得一个非原子操作变成原子操作吗&#xff1f; 3、volatile 修饰符的有过什么实践&#xff1f; 4、volatile 类型变量提供什么保证&#xff1f; 5、10 个线程和 2 个线程的同步代码&#xff0c;哪个更容…

使用 ClickHouse 深入了解 Apache Parquet (二)

【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 这篇文章是我们的 Parquet 和 ClickHouse 博客系列的第二部分。在这篇文章中&#xff0c;我们将更详细地探讨 Parquet 格式&#xff0c;重点介绍使用 ClickHouse 读写文…

Xline 源码解读(四)—— CURP 状态机引擎

在上一篇源码解读的文章&#xff08;Xline 源码解读&#xff08;三&#xff09; —— CURP Server 的实现&#xff09;中&#xff0c;我们简单阐述了Xline 的 Curp Server 是如何实现的。接下来&#xff0c;就让我们话接上回&#xff0c;继续深入地来了解 Curp Server 中的一些…

利用Python爬虫获取某乎热榜

如今&#xff0c;某乎必须要登录才能查看相关话题内容&#xff0c;给我们的日常造成了极大的不便&#xff0c;今天我就教大家如何利用简单的代码&#xff0c;绕开登录限制。 准备工作 配置好python运行环境&#xff0c;推荐 pycharm。复制下面的源代码&#xff0c;运行&#x…

LNMP架构部署Discuz论坛系统

文章目录 LNMP架构&部署Discuz论坛系统部署LNMP架构环境前期准备安装Nginx安装mariadb安装php配置nginx 部署Discuz论坛系统下载Discuz论坛系统代码包部署Discuz论坛系统配置虚拟主机安装Discuz论坛访问站点尝试注册一个账号 LNMP架构&部署Discuz论坛系统 部署LNMP架构…

试着写几个opencv的程序

一、认识opencv OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉库&#xff0c;旨在提供丰富的图像处理和计算机视觉功能&#xff0c;以帮助开发者构建视觉应用程序。OpenCV最初由英特尔开发&#xff0c;现在由社区维护和支持。它支持…

Day5力扣打卡

打卡记录 对角线上不同值的数量差&#xff08;矩阵对角线遍历 前缀和&#xff09; 链接 思路&#xff1a;由于任意行 i 与 列 j&#xff0c;满足对角线上 i j t 的关系&#xff0c;t 的范围为 [1 - n, m - 1]&#xff0c;设 s t n&#xff0c;可以得到 s的范围为 [1, n …

计算机网络学习笔记(四):网络层(待更新)

目录 4.1 IP地址、子网划分、合并超网 4.1.1 IP地址、子网掩码、网关 4.1.2 IP地址的编址方法1&#xff1a;IP地址分类&#xff08;A~E类地址、保留的IP地址&#xff09; 4.1.4 IP地址的编址方法2&#xff1a;子网划分&#xff08;等长、变长&#xff09; 4.1.5 IP地址的编…

Adobe 推出 Photoshop Elements 2024 新版

&#x1f989; AI新闻 &#x1f680; Adobe 推出 Photoshop Elements 2024 新版 摘要:Adobe 最新发布 Photoshop Elements 2024 版本,新增引入 AI 功能,提供匹配颜色、创建照片卷、一键选择照片天空或背景等新功能,界面也进行了优化更新。本次发布重点加强了 AI 支持,简化复杂…

打卡go学习第一天

8.1 下面展示一些 代码。 package mainimport ("fmt""net""os""time" )type Clock struct {Name stringAddr string &#xff5d; func main() {clocks : []Clock{{Name: "New York", Addr: "localhost:8000"…

spring cloud Eureka集群模式搭建(IDEA中运行)

spring cloud Eureka集群模式搭建&#xff08;IDEA中运行&#xff09; 新建springboot 工程工程整体目录配置文件IDEA中部署以jar包形式启动总结 新建springboot 工程 新建一个springboot 工程&#xff0c;命名为&#xff1a;eureka_server。 其中pom.xml文件为&#xff1a; …

OnlyOffice documentType类型值

参考官网说明&#xff1a; https://api.onlyoffice.com/editors/config/#documentType 其值为&#xff1a;word | cell | slide

SpringCloud: feign整合sentinel实现降级

一、加依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…

060:mapboxGL点击某处,通过flyTo,以动画的形式聚焦到此点

第060个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中点击某处,通过flyto,以动画的形式聚焦到此点。这里用到了flyTo的方法,里面可以设置bearing,zoom,pitch等众多的属性内容。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示…

RabbitMQ运行机制和通讯过程介绍

文章目录 1.RabbitMQ 环境搭建2.RabbitMQ简介3.RabbitMQ的优势&#xff1a;4. rabbitmq服务介绍4.1 rabbitmq关键词说明4.2 消息队列运行机制4.3 exchange类型 5.wireshark抓包查看RabbitMQ通讯过程 1.RabbitMQ 环境搭建 参考我的另一篇&#xff1a;RabbitMQ安装及使用教程&am…

SystemVerilog Assertions应用指南 Chapter1.20“ $past”构造

1.20“ $past”构造 SVA提供了一个内嵌的系统任务“$past”,它可以得到信号在几个时钟周期之前的值。在默认情况下,它提供信号在前一个时钟周期的值。结构的基本语法如下 $past (signal_name ,number of clock cycles) 这个任务能够有效地验证设计到达当前时钟周期的状态所采用…

购药不烦恼:线上购药小程序的快捷方式

在这个数字化时代&#xff0c;线上购药小程序的快捷方式正在改变着我们购药的方式。本文将介绍如何通过使用Python和Flask框架创建一个简单的线上购药小程序的原型&#xff0c;为用户提供购药的便利和快捷体验。 安装和设置 首先&#xff0c;确保你已经安装了Python和Flask。…