一、核心架构分层
4 层架构体系
应用层 (App Layer)
├─ EthernetManager [以太网管理 API]
├─ WifiManager [WiFi 管理 API]
├─ TelephonyManager [蜂窝网络 API]
└─ ConnectivityManager [统一网络 API]
↓
框架层 (Framework Layer)
├─ EthernetService/Tracker [以太网服务]
├─ WifiService [WiFi 服务]
├─ Phone/DataNetwork [蜂窝数据服务]
├─ ConnectivityService [连接协调]
└─ NetworkManagementService [网络管理]
↓
Binder 通信层 (IPC)
├─ INetd [netd Binder 接口]
├─ IEthernetManager [以太网 Binder 接口]
├─ ITelephony [电话 Binder 接口]
└─ INetdUnsolicitedEventListener [事件回调]
↓
内核层 (Kernel Layer)
├─ Netlink 事件监听 [/proc/net/netlink]
├─ 网络接口驱动 [eth0, wlan0, rmnet_data0]
├─ 路由表管理 [ip route]
└─ Firewall/eBPF [netfilter, tc]
二、物理接口的 3 大类型管理
1. 以太网接口管理(EthernetService)
EthernetTracker (主要服务)
├─ EthernetNetlinkMonitor
│ └─ 监听 RTM_NEWLINK/RTM_DELLINK 事件
│
├─ EthernetNetworkFactory
│ ├─ 创建 NetworkInterfaceState
│ ├─ 注册 NetworkOffer(候选网络)
│ └─ 管理 NetworkAgent(活跃网络)
│
└─ IP 配置管理
├─ DHCP 获取
├─ 静态 IP 配置
└─ LinkProperties 更新
关键事件:
// EthernetTracker 事件处理
EthernetNetlinkMonitor.processRtNetlinkLinkMessage()
├─ RTM_NEWLINK → onNewLink()
│ ├─ maybeTrackInterface(ifname)
│ └─ updateInterfaceState(ifname, linkUp)
│
└─ RTM_DELLINK → onDelLink()
└─ stopTrackingInterface(ifname)
2. WiFi 接口管理
WiFiStateMachine / WifiService
├─ 接口 ENABLE/DISABLE
│ └─ wlan0 创建/销毁
│
├─ 链接事件
│ ├─ 扫描 (SCAN)
│ ├─ 连接 (CONNECT)
│ ├─ 关联 (ASSOCIATED)
│ └─ 获取 IP (OBTAINING_IPADDR)
│
└─ LinkProperties
├─ IP 地址
├─ DNS 服务器
├─ 路由表
└─ 代理信息
3. 蜂窝网络接口管理(Telephony)
DataNetwork / DataConnection
├─ APN 设置
│ ├─ 互联网 APN (default)
│ ├─ IMS APN
│ └─ 彩信 APN (mms)
│
├─ 接口创建
│ └─ rmnet_data0, rmnet_data1 等
│
├─ 连接状态
│ ├─ DISCONNECTED
│ ├─ CONNECTING
│ ├─ CONNECTED
│ ├─ SUSPENDED
│ ├─ DISCONNECTING
│ └─ HANDOVER_IN_PROGRESS
│
└─ LinkProperties
├─ IPv4 地址 + Prefix
├─ IPv6 地址 + Prefix
├─ 默认路由
└─ DNS 服务器
三、物理接口发现与监控机制
Netlink 事件流
内核网络栈
↓ [RTM_NEWLINK/RTM_DELLINK 消息]
Netlink Socket (/proc/sys/kernel/netlink/*)
↓
NetlinkHandler (system_netd)
├─ parseIfInfoMessage() [解析接口信息]
├─ parseIfAddrMessage() [解析地址信息]
├─ parseRtMessage() [解析路由信息]
└─ notifyInterfaceAdded() [回调上层]
↓ [Binder IPC]
NetdUnsolicitedEventListener (framework)
├─ onInterfaceAdded(ifName)
├─ onInterfaceRemoved(ifName)
├─ onInterfaceChanged(ifName, up)
├─ onInterfaceLinkStateChanged(ifName, up)
├─ onInterfaceAddressUpdated(addr, ifName)
└─ onInterfaceAddressRemoved(addr, ifName)
↓
NetworkManagementService
├─ notifyInterfaceStatusChanged()
├─ notifyInterfaceLinkStateChanged()
└─ 通知注册的观察者
↓
各服务响应
├─ EthernetTracker
├─ WifiService
├─ TelephonyManager
└─ ConnectivityService
关键 Netlink 消息类型:
| 消息类型 | 触发条件 | 处理方式 |
|---|---|---|
RTM_NEWLINK | 接口创建或状态改变 | 检查 IFF_UP, IFF_LOWER_UP 标记 |
RTM_DELLINK | 接口删除 | 清理本地状态 |
RTM_NEWADDR | IP 地址添加 | 更新 LinkProperties |
RTM_DELADDR | IP 地址删除 | 移除 LinkAddress |
RTM_NEWROUTE | 路由添加 | 更新路由表 |
RTM_DELROUTE | 路由删除 | 移除路由规则 |
四、NetworkStateSnapshot:接口状态快照
这是管理接口状态的统一数据结构:
public final class NetworkStateSnapshot implements Parcelable {
// 网络对象
@NonNull private final Network mNetwork;
// 网络能力(transport、capability)
@NonNull private final NetworkCapabilities mNetworkCapabilities;
// 链路属性(IP、DNS、路由、MTU)
@NonNull private final LinkProperties mLinkProperties;
// 蜂窝网络订阅 ID
@Nullable private final String mSubscriberId;
// 遗留网络类型(TYPE_WIFI、TYPE_MOBILE 等)
private final int mLegacyType;
}
LinkProperties 的核心字段
public final class LinkProperties implements Parcelable {
// 接口名称(wlan0、rmnet_data0、eth0 等)
private String mIfaceName;
// IP 地址列表
private final ArrayList<LinkAddress> mLinkAddresses;
// DNS 服务器
private final ArrayList<InetAddress> mDnses;
// 路由信息
private ArrayList<RouteInfo> mRoutes;
// DHCP 服务器
private Inet4Address mDhcpServerAddress;
// 代理配置
private ProxyInfo mHttpProxy;
// MTU(最大传输单元)
private int mMtu;
// NAT64 前缀(IPv6 only 网络)
private IpPrefix mNat64Prefix;
}
五、接口配置与管理流程
以太网接口完整流程
1. 硬件/驱动层
└─ 以太网设备插入
└─ 内核创建 eth0 接口
2. Netlink 事件
└─ RTM_NEWLINK (eth0, flags=0)
└─ IFF_LOWER_UP 标记
3. NetlinkHandler (netd)
├─ 解析: INTERFACE=eth0, IFINDEX=4
├─ Action = kLinkUp
└─ 调用 notifyInterfaceLinkChanged("eth0", true)
4. NetworkManagementService (Java)
└─ onInterfaceLinkStateChanged("eth0", true)
└─ 调用 mNetdService.interfaceGetCfg("eth0")
5. EthernetTracker 响应
├─ maybeTrackInterface("eth0")
│ ├─ 检查是否有效以太网接口
│ ├─ 创建 NetworkInterfaceState
│ └─ 注册 IpClient (DHCP)
│
└─ updateInterfaceState("eth0", true)
├─ 启动 DHCP 获取
└─ 创建 NetworkAgent
6. DHCP 获取完成
└─ InterfaceConfiguration 更新
├─ IP 地址
├─ 网关
├─ DNS 服务器
└─ 路由
7. LinkProperties 更新
└─ ConnectivityService
├─ 检查网络质量
├─ 评分并排名
└─ 可能升级为默认网络
蜂窝网络接口流程
1. RIL (Radio Interface Layer) 接收网络可用性
└─ DATA_CALL_LIST_CHANGED
2. Phone.onDataConnectionStateChanged()
└─ DataNetworkController 创建 DataNetwork
3. DataNetwork 初始化
├─ 设置 APN
├─ 调用 DataService.setupDataCall()
└─ 传递给 Modem
4. Modem 创建 PDN 连接
└─ 例:rmnet_data0 接口
5. RIL 返回连接信息
├─ IP 地址
├─ DNS 服务器
├─ 网关
└─ PCO (Protocol Configuration Options)
6. InterfaceController 配置接口
├─ ifconfig rmnet_data0 up
├─ ip addr add 10.0.0.1/8
├─ ip route add default via 10.0.0.254
└─ echo "10.0.0.254" > /sys/class/net/rmnet_data0/gw
7. NetworkAgent 上报
└─ ConnectivityService
├─ 发送 OBTAINED_IPV4_STATE 事件
└─ 可能升级为默认网络
六、InterfaceConfiguration 管理
接口配置的低层 API:
InterfaceConfiguration (framework)
├─ 标记 (Flags)
│ ├─ "up" / "down"
│ ├─ "broadcast"
│ ├─ "loopback"
│ ├─ "point-to-point"
│ ├─ "running"
│ └─ "multicast"
│
└─ IP 地址
└─ LinkAddress
netd 通过 INetd Binder 接口操作:
// 获取接口配置
interfaceGetCfg(String ifName) → InterfaceConfigurationParcel
// 设置接口配置
interfaceSetCfg(InterfaceConfigurationParcel cfg)
// 添加地址
interfaceAddAddress(String ifName, String address, int prefixLength)
// 移除地址
interfaceDelAddress(String ifName, String address, int prefixLength)
// 清空所有地址
interfaceClearAddrs(String ifName)
// 设置 MTU
interfaceSetMtu(String ifName, int mtu)
// 启用/禁用 IPv6
interfaceSetEnableIPv6(String ifName, boolean enable)
七、物理网络与虚拟网络的关系
物理网络 (PhysicalNetwork)
├─ ID: 通常 100-200
├─ 接口: wlan0, rmnet_data0, eth0
├─ 权限: PERMISSION_NETWORK, PERMISSION_SYSTEM
│
└─ 默认网络管理
├─ 默认路由表 (100)
├─ 优先级规则
└─ UID 路由选择
虚拟网络 (VirtualNetwork)
├─ ID: VPN (1-99)
├─ 类型: SECURE (VPN) / NON_SECURE (forward)
│
└─ 隧道接口: tun0, ipsec0, vti0
关键映射关系
└─ RouteController
├─ addInterfaceToPhysicalNetwork()
│ └─ 添加 FIB 规则 (策略路由)
│
├─ addInterfaceToVirtualNetwork()
│ └─ 绑定 VPN 用户
│
└─ modifyPhysicalNetworkPermission()
└─ 更新权限规则
八、接口生命周期状态机
EthernetManager 定义的状态
public static final int STATE_ABSENT = 0; // 接口不存在
public static final int STATE_LINK_DOWN = 1; // 链路未就绪
public static final int STATE_LINK_UP = 2; // 链路就绪
public static final int ROLE_NONE = 0; // 无特殊角色
public static final int ROLE_CLIENT = 1; // 客户端(获取网络)
public static final int ROLE_SERVER = 2; // 服务器(提供网络/热点)
状态转移图
STATE_ABSENT
↓ [硬件插入/创建]
STATE_LINK_DOWN (链路未就绪,驱动未加载)
↓ [驱动加载,链路检测]
STATE_LINK_UP (链路就绪,可获取 IP)
↓ [获取 IP 完成]
[ROLE 变更]
├─ ROLE_NONE → ROLE_CLIENT (获取网络)
└─ ROLE_NONE → ROLE_SERVER (热点)
↓ [移除配置 / 禁用]
STATE_LINK_DOWN
↓ [硬件移除]
STATE_ABSENT
九、接口事件观察者模式
// 观察者接口
public interface INetworkManagementEventObserver {
void interfaceStatusChanged(String iface, boolean up);
void interfaceLinkStateChanged(String iface, boolean up);
void interfaceAdded(String iface);
void interfaceRemoved(String iface);
void addressUpdated(String iface, LinkAddress address);
void addressRemoved(String iface, LinkAddress address);
}
// 实现观察者
EthernetTracker implements INetworkManagementEventObserver
├─ onInterfaceAdded()
├─ onInterfaceRemoved()
├─ onInterfaceChanged()
└─ ...
// 注册观察者
mNetworkManagementService.registerObserver(
ethernetTracker, OBSERVING_MASK);
十、多接口同时在线的优先级管理
ConnectivityService.chooseNetworkForRequest()
├─ NetworkScore 计算
│ ├─ TransportType 分值 (WIFI > Cellular)
│ ├─ Capability 分值
│ ├─ 用户偏好 (ConnectivityManager.startUsingNetworkFeature())
│ └─ 时间戳
│
├─ 排序所有可用网络
│ └─ mNetworks.sort(byScore)
│
└─ 选择最优网络
└─ mDefaultNetwork = networks[0]
示例多接口场景
┌─────────────────────────────────────┐
│ 可用接口优先级 │
├─────────────────────────────────────┤
│ [1] WIFI (Score: 80, 优先) │ ← 默认网络
│ [2] 5G (Score: 75) │
│ [3] 以太网 (Score: 70) │
│ [4] 4G LTE (Score: 60) │
└─────────────────────────────────────┘
当 WIFI 断开
└─ 自动切换到 5G (Score 75)
WIFI 重新连接
└─ 自动切换回 WIFI (Score 80)
总结:物理接口管理的 3 大核心服务
| 服务 | 职责 | 关键接口 |
|---|---|---|
| EthernetService | 以太网检测、配置、生命周期管理 | EthernetManager.setInterfaceEnabled() |
| WiFiService | WiFi 接口启用/禁用、连接管理 | WifiManager.setWifiEnabled() |
| DataNetwork | 蜂窝数据 APN、连接、接口创建 | TelephonyManager.getDataState() |
| ConnectivityService | 接口监控、网络评分、默认网络选择、路由管理 | ConnectivityManager.getActiveNetwork() |
这 4 个服务通过 Netlink 事件通知机制 实时监控物理接口变化,通过 NetworkStateSnapshot 统一表示接口状态,通过 RouteController 管理内核路由和 FIB 规则,最终实现 Android 的 多网并存与智能选择 能力!