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;以及各种资源分享&…

主机重启后k8s kubelet无法自动启动问题解决梳理

1.问题描述 OS Version:CentOS Linux release 7.9.2009 (Core) K8S Version:Kubernetes v1.20.4 K8S安装配置完成后,重启服务器发现,kubelet没有正常启动(systemctl status kubelet) 命令: systemctl status kubelet [root@centos79-3 ~]# systemctl status kubelet ●…

使用 pyspark 进行 Classification 的简单例子

This is the second assignment for the Coursera course “Advanced Machine Learning and Signal Processing” Just execute all cells one after the other and you are done - just note that in the last one you have to update your email address (the one you’ve u…

Java设计模式之过滤器模式(Filter Pattern)

过滤器模式&#xff08;Filter Pattern&#xff09;是一种常用的设计模式&#xff0c;它用于通过一系列条件来过滤对象集合&#xff0c;并将满足条件的对象保留下来。该模式可以帮助我们在不修改原始对象集合的情况下&#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架构…

mongodb创建管理账户步骤

本文以ubuntu系统配置为例&#xff1a; 1.数据库进入和查看指令 mongo ##进入账户 show dbs ##查看有哪些数据库 use admin ##进入管理员数据库admin show collections ##查看有哪些数据集合 db.system.users.find() ##查看当前有哪些管理员账号2.创建管理员账号 …

试着写几个opencv的程序

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

@ResponseBodyAdvice @RequestBodyAdivce失效

背景 最近项目要有向外部提供服务的能力&#xff0c;但是考虑到数据安全问题&#xff0c;要对接口进行加解密&#xff1b;实现加解密的方案有很多&#xff0c;比如过滤器、拦截器、继承RequestResponseBodyMethodProcessor什么的&#xff0c;不过我最近正在了解ResponseBodyAd…

【华为OD机试】HJ26 字符串排序

描述 编写一个程序&#xff0c;将输入字符串中的字符按如下规则排序。 规则 1 &#xff1a;英文字母从 A 到 Z 排列&#xff0c;不区分大小写。 如&#xff0c;输入&#xff1a; Type 输出&#xff1a; epTy 规则 2 &#xff1a;同一个英文字母的大小写同时存在时&#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 …

C#WPF Prism框架区域管理应用实例

本文实例演示C#WPFPrism框架区域管理应用实例 目录 一、Prism框架区域 二、不使用Prism框架的RegionManager 三、使用Prism框架的RegionManager 一、Prism框架区域

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

目录 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"…