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

张开发
2026/6/5 2:13:02 15 分钟阅读
告别网络切换烦恼:手把手教你让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.scoreprivate 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 90003.2 集成到系统镜像对于Rockchip平台设备修改编译配置文件# 在vendor/rockchip/common/wifi/wifi.mk中添加 $(CUR_PATH)/wifi/ethernet_wifi.sh:$(TARGET_COPY_OUT_VENDOR)/bin/ethernet_wifi.sh3.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_completed1 start ethernet_wifi3.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%

更多文章