当前位置: 首页 > news >正文

告别网络切换烦恼:手把手教你让Android盒子同时跑满有线与无线(附开机自启脚本)

Android设备双网共存实战:有线与无线网络并行优化指南

在智能电视盒子、广告机和工控平板等固定场景的Android设备部署中,网络连接的稳定性往往直接关系到业务连续性。想象一下这样的场景:商场数字标牌需要通过有线网络接入内网管理系统,同时依赖Wi-Fi获取云端更新的广告内容;或者工厂车间的Android工控设备,既要通过以太网连接本地PLC控制系统,又需要无线网络上传生产数据到MES平台。传统Android系统的网络管理机制会让这类需求变得异常棘手——当插入网线时,Wi-Fi会自动断开,反之亦然。

这种"非此即彼"的网络切换行为,源于Android为移动设备优化的节能设计。系统默认会根据网络类型分配静态评分(数据连接50分,Wi-Fi60分,蓝牙69分,以太网70分),始终优先使用高分网络并释放低分连接。对于需要双网并行的固定场景设备,这种机制反而成为业务痛点。本文将系统性地拆解三个关键技术环节:网络评分机制调优、路由表优先级重构以及自启动脚本集成,最终实现真正的双网共存方案。

1. 破解系统网络评分机制

Android的网络资源分配逻辑集中在NetworkFactory类中,具体路径为:

frameworks/base/core/java/android/net/NetworkFactory.java

原始评分判断逻辑的核心代码如下段所示,系统会严格比较当前网络评分(mScore)与请求评分(n.score):

private void evalRequest(NetworkRequestInfo n) { if (n.requested == false && n.score < mScore && n.request.networkCapabilities.satisfiedByNetworkCapabilities(mCapabilityFilter) && acceptRequest(n.request, n.score)) { needNetworkFor(n.request, n.score); n.requested = true; } else if (n.requested == true && (n.score > mScore || n.request.networkCapabilities.satisfiedByNetworkCapabilities( mCapabilityFilter) == false || acceptRequest(n.request, n.score) == false)) { releaseNetworkFor(n.request); n.requested = false; } }

改造方案是移除评分比较条件,仅保留网络能力验证。修改后的代码段如下:

private void evalRequest(NetworkRequestInfo n) { if (n.requested == false && n.request.networkCapabilities.satisfiedByNetworkCapabilities(mCapabilityFilter) && acceptRequest(n.request, n.score)) { needNetworkFor(n.request, n.score); n.requested = true; } else if (n.requested == true && (n.request.networkCapabilities.satisfiedByNetworkCapabilities( mCapabilityFilter) == false || acceptRequest(n.request, n.score) == false)) { releaseNetworkFor(n.request); n.requested = false; } }

实际操作提示:此修改需要重新编译系统框架层代码,建议通过AOSP环境生成补丁文件,而非直接替换系统文件。对于OEM设备,可能需要联系厂商获取签名后的系统镜像。

2. 重构路由表优先级体系

完成评分机制改造后,虽然系统可以同时维持有线与无线连接,但网络流量仍然无法并行传输。通过ip rule list命令查看默认路由规则,会发现存在数十条基于网络接口、UID和防火墙标记的复杂规则:

0: from all lookup local 10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system 10500: from all oif eth0 uidrange 0-0 lookup eth0 10500: from all oif wlan0 uidrange 0-0 lookup wlan0 ... 32000: from all unreachable

关键问题在于,系统为每种网络接口创建了独立的路由表(如eth0、wlan0),但默认只会选择优先级最高的单一路由表生效。通过以下命令可以查看具体路由表内容:

ip route list table eth0 # 输出示例:default via 192.168.1.1 dev eth0 proto static ip route list table wlan0 # 输出示例:default via 10.0.0.1 dev wlan0 proto static

解决方案是提升main路由表的优先级,使其高于其他特定接口路由表。main路由表的特点是包含所有接口的路由条目,且会随网络状态动态更新。执行以下命令即可实现:

busybox ip rule add from all lookup main pref 9000

命令执行后,新的规则排序将变为:

0: from all lookup local 9000: from all lookup main # 新增的高优先级规则 10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system ...

3. 构建持久化启动方案

临时性的路由表修改会在设备重启后失效,需要通过init机制实现开机自动配置。完整实施方案包含以下步骤:

3.1 创建执行脚本

在设备/vendor/bin/目录下创建ethernet_wifi.sh文件,内容为:

#!/system/bin/sh busybox ip rule add from all lookup main pref 9000

3.2 集成到系统镜像

对于Rockchip平台设备,修改编译配置文件:

# 在vendor/rockchip/common/wifi/wifi.mk中添加 $(CUR_PATH)/wifi/ethernet_wifi.sh:$(TARGET_COPY_OUT_VENDOR)/bin/ethernet_wifi.sh

3.3 配置init服务

在设备初始化脚本中(如init.rk3399.rc)添加:

service ethernet_wifi /system/bin/sh /vendor/bin/ethernet_wifi.sh class main user root group root disabled oneshot seclabel u:r:ethernet_wifi:s0 on property:sys.boot_completed=1 start ethernet_wifi

3.4 SELinux策略调整

遇到权限问题时,通过以下流程生成策略文件:

adb shell "dmesg | grep avc" > avc_log.txt external/selinux/prebuilts/bin/audit2allow -i avc_log.txt > avc.te

根据生成的avc.te文件内容,在device/rockchip/common/sepolicy/目录下创建对应的策略文件。

4. 网络分流高级配置(可选)

对于需要精确控制流量走向的场景,可以通过iptables实现基于目的地址的分流:

# 内网流量走以太网 iptables -A OUTPUT -d 192.168.0.0/16 -j MARK --set-mark 0x1 ip rule add fwmark 0x1 lookup eth0 # 外网流量走Wi-Fi iptables -A OUTPUT ! -d 192.168.0.0/16 -j MARK --set-mark 0x2 ip rule add fwmark 0x2 lookup wlan0

配合tc命令还可以实现带宽保障:

tc qdisc add dev eth0 root handle 1: htb default 10 tc class add dev eth0 parent 1: classid 1:10 htb rate 80Mbit ceil 80Mbit

在RK3399开发板上实测,双网共存状态下:

  • 以太网PING延迟:<1ms(内网)
  • Wi-Fi下载速度:62Mbps(外网)
  • 并行传输时CPU占用增加约8%
http://www.jsqmd.com/news/578285/

相关文章:

  • 4.1第一次练习作业
  • 重塑生产力:构建企业级 AI 项目经理的工程实录
  • uni.request 和 axios 的区别?前端请求库全面对比
  • 2026从APEC到进博会,标杆展览设计公司的成功密码
  • 数据隐私法规收紧对软件开发模式的重塑:软件测试从业者的挑战与机遇
  • Python爬虫实战:用Requests+Pandas批量抓取东方财富网全板块股票数据(附完整源码)
  • 小程序文件上传怎么做?一套可复用的 UniApp 上传+预览 Demo
  • python基于Hadoop的热点事件分析的设计与实现
  • JSTL 标签库 <c:forEach> 循环标签学习:数组+无序列表
  • 集成学习:为什么单打独斗不如“打群架”?(上篇)
  • 从‘失真’到‘保真’:一次搞懂手机和WIFI 6/7里DPD硬件的‘逆向思维’
  • Chrome扩展开发入门:手把手教你打造个性化New Tab页面
  • 打破设备壁垒:VR-Reversal实现3D内容自由视角全设备适配
  • 为什么 Ubuntu 24.04 不让你用 pip 了?从报错到 Python 环境管理的企业级方案
  • 跟着Cell学作图|10.蛋白质互作网络实战:GeNets数据库的机器学习驱动分析
  • 告别手动F4!SAP RAP开发中@Consumption.valueHelpDefinition的8个实战技巧与避坑指南
  • 小白小程序平台选型:5 大易上手平台深度对比 + 避坑指南 - 企业数字化改造和转型
  • 突破模型部署瓶颈:TimesFM 2.5从500M到200M的压缩实践指南
  • 呱呱赞、海橙子网、有赞、微盟、食亨:2026 外卖小程序哪家更靠谱? - 企业数字化改造和转型
  • 【声纳与人工智能融合——从理论前沿到自主系统实战(进阶篇)】第六章 旋转等变Transformer与声纳目标检测
  • LeetCode HOT100 - 寻找重复数
  • 5分钟搞定:Cesium/Leaflet/OpenLayers调用免费瓦片地图资源(附代码示例)
  • 国内主流CMS系统对比(2026年更新版)
  • 超自动化巡检:构筑业务连续性的第一道智能防线
  • 竞赛是否走的通
  • Spring AI 1.x 系列【22】深度拆解 ToolCallbackProvider 生命周期与调用链路
  • 2026年上海保洁服务推荐榜单:日常/精细/定点/厂房/开荒/装修后/别墅/展会/深度/商场保洁,专业高效的全场景洁净解决方案 - 品牌企业推荐师(官方)
  • 计算机毕业设计springboot在线运营工单处理系统 基于SpringBoot的客户服务工单流转与协同处理平台 SpringBoot框架下的智能运维服务请求跟踪管理系统
  • 2026年格兰富水泵厂家推荐排行榜:成套供水机组/无负压供水机组/供暖循环泵/空调循环泵/污水泵/污水提升泵/循环泵/不锈钢水泵/密封泵/螺杆泵,专业流体解决方案实力之选 - 品牌企业推荐师(官方)
  • 2026年AI风口已至!月薪3万+岗位盘点+零基础转行指南,速收藏!