安卓Connectivity分析

Android 提供了丰富的网络管理 API,允许开发者灵活控制网络连接和流量路由。需要注意的是,许多旧版 API(如 NetworkInfo)已被废弃,建议优先使用现代的 API,如 NetworkCapabilities 和 ConnectivityManager.NetworkCallback,以确保应用的未来兼容性和稳定性。

在这里插入图片描述
之前更新文章写了很多,没保存,只能简单总结下了。主要就是modifyRoute使用include/uapi/linux/rtnetlink.h实现

  1. modifyRoute(RTM_NEWROUTE, netId, ifName, dst, gateway);
    → 使用 netlink socket 构建消息(struct nlmsghdr + struct rtmsg)
    → send() 到内核的 netlink 路由子系统
  2. 使用 shell 执行 iptables、ip6tables,或 xtables 接口。
  3. 当插入以太网设备时(如 USB 网卡或主板网卡),对应的内核驱动模块(如 r8169)会通过 register_netdev() 向内核网络子系统注册一个网络设备(如 eth0、enp2s0)。成功后内核通过 uevent 通知用户空间。

1. Network类

Network 类提供了一组方法,允许开发者将流量绑定到特定的网络(如 Wi-Fi、VPN 或移动数据),并对网络流量进行更细粒度的控制。

关键方法:
getSocketFactory():

返回一个与指定网络绑定的 SocketFactory。
通过此工厂创建的任何 Socket 都会强制将流量路由到此网络。
注意:如果网络断开连接,此工厂以及通过它创建的任何 Socket 都会失效。
openConnection(URL url):

打开指定 URL 的连接,并强制所有流量通过指定的网络。
仅支持 HTTP 和 HTTPS 协议。
bindSocket(DatagramSocket socket):

将指定的 DatagramSocket(UDP 套接字)绑定到此网络。
无论全局网络绑定如何设置,绑定的套接字流量都会通过此网络。

2. NetworkInfo类

NetworkInfo 用于描述网络接口的状态和类型。虽然在 API 29 中已被废弃,但仍在旧版系统中被广泛使用。

关键属性:
mNetworkType:
网络类型的常量值,由 ConnectivityManager.TYPE_* 定义:
TYPE_MOBILE: 移动数据。
TYPE_WIFI: Wi-Fi。
TYPE_ETHERNET: 以太网。
TYPE_WIFI_P2P: Wi-Fi 点对点。
TYPE_VPN: 虚拟专用网络。
调试命令:
dumpsys netstats:显示网络接口的详细信息和统计数据。
dumpsys connectivity:展示当前活动的网络提供者和它们的配置,例如:
WifiNetworkFactory、EthernetNetworkFactory、VpnNetworkProvider 等。
LinkProperties:
提供网络接口的详细属性,例如:

InterfaceName:接口名称,如 wlan0。
LinkAddresses:分配的 IP 地址列表。
DnsAddresses:DNS 服务器地址。
Routes:网络路由信息,包括网关和目标地址。

3. DnsManager类

DnsManager 用于管理网络的 DNS 设置,负责域名解析的配置和控制。

主要功能:
添加或修改特定网络的 DNS 服务器。
查询或更新 DHCP 服务器地址。
配置网络的 HTTP 代理。

4. NetworkRanker类

这是一个用于从网络列表中选择最优网络的系统,可以根据以下指标选择最佳网络:

信号强度。
网络延迟。
带宽。
相关接口:
IConnectivityManager:
getActiveNetwork:获取当前的活动网络(如果有)。
getNetworkInfo:返回当前活动网络接口的 NetworkInfo(已废弃)。
getActiveLinkProperties:获取当前活动网络的 LinkProperties。
getNetworkCapabilities:返回当前网络的能力(如传输类型、带宽等)。
requestNetwork:根据指定条件请求网络连接。

5. Captive Portal 和 QoS

startCaptivePortalApp:当设备连接到需要身份验证的网络(如公共 Wi-Fi)时,启动 Captive Portal 应用以提示用户登录。
registerQosSocketCallback:注册回调以监控某个套接字的服务质量(QoS)参数。

6. 其他功能

setVpnNetworkPreference:设置 VPN 的网络优先级。
setUidFirewallRule:为特定的 UID 设置防火墙规则。
startTcpKeepalive:为指定的套接字启动 TCP 保活消息,确保连接不会因为空闲而中断。
使用场景与实例
强制流量通过指定网络:

使用 Network.getSocketFactory() 将套接字绑定到特定网络。

示例:即使设备当前连接着移动数据,也可通过 Wi-Fi 路由应用的流量。
公共 Wi-Fi 登录:

当用户连接到需要身份验证的 Wi-Fi 时,startCaptivePortalApp 自动提示用户完成登录。
监控网络状态:

通过 getNetworkCapabilities 和 getActiveLinkProperties,分析当前网络的质量和配置。
自定义 DNS 和代理配置:

使用 DnsManager 和 LinkProperties 配置特定网络的 DNS 或 HTTP 代理。
VPN 管理:

使用 setVpnNetworkPreference 确保 VPN 流量优先处理,提升安全性。

getActiveLinkProperties
getNetworkCapabilities
getTetherableIfaces
getGlobalProxy

startCaptivePortalApp
requestNetwork
setVpnNetworkPreference
setUidFirewallRule
offerNetwork
registerQosSocketCallback

startTcpKeepalive

. VPN 管理
setVpnNetworkPreference(int networkType)

设置 VPN 的网络优先级(指定某个网络用于 VPN 流量)。
prepareVpn(String oldPackage, String newPackage)

准备使用新的 VPN 应用连接。
返回一个 Intent,需要用户授权后才能启动 VPN。
7. 网络测速和 Keepalive
startTcpKeepalive(Network network, FileDescriptor fd, int interval, KeepaliveCallback callback)

为指定网络上的 TCP 连接启动 Keepalive(心跳),确保连接保持活跃。
常用场景:优化 VoIP 和实时应用的连接稳定性。
stopKeepalive(Network network, int keepaliveId)

停止 TCP Keepalive。
8. 代理与 DNS 设置
getGlobalProxy()

获取设备的全局代理设置。
setGlobalProxy(ProxyInfo proxyInfo)

配置设备的全局代理。
addDnsServer()

手动添加 DNS 服务器(通过其他 API 实现)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值