一、NetworkStack 总体架构
1.1 概念定义
NetworkStack 是 Android 系统网络管理框架的总称,由多个独立但相互协作的模块组成:
┌─────────────────────────────────────────────────────┐
│ 应用层(APP Framework) │
│ ConnectivityManager / VpnManager / DNS │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ SystemServer 管理层(frameworks_base) │
│ ┌────────────────────────────────────────────────┐ │
│ │ ConnectivityService(可更新部分) │ │
│ │ ├─ 网络管理 │ │
│ │ ├─ DNS 解析 │ │
│ │ ├─ 路由管理 │ │
│ │ └─ VPN 管理 │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ 其他网络服务 │ │
│ │ ├─ NetworkManagementService (管理层) │ │
│ │ ├─ NetworkPolicyManagerService (策略层) │ │
│ │ ├─ WifiService (WiFi) │ │
│ │ └─ TelephonyService (蜂窝) │ │
│ └────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 系统服务实现层(packages_modules_Connectivity) │
│ ┌────────────────────────────────────────────────┐ │
│ │ ConnectivityService 具体实现 │ │
│ │ ├─ NetworkAgentInfo 管理 │ │
│ │ ├─ 网络评分与选择 │ │
│ │ ├─ 网络切换逻辑 │ │
│ │ └─ 观察者回调机制 │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ DNS 解析模块 (DnsResolver) │ │
│ │ ├─ DNS 查询 │ │
│ │ ├─ Private DNS (DoH/DoT) │ │
│ │ └─ DNS 缓存 │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ 路由管理模块 (RoutingCoordinator) │ │
│ │ ├─ 路由表管理 │ │
│ │ ├─ NAT64 转换 (clatd) │ │
│ │ └─ IPv4/IPv6 协议栈 │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ VPN 模块 │ │
│ │ ├─ VPN 代理管理 │ │
│ │ ├─ TUN/TAP 驱动 │ │
│ │ └─ Always-on VPN │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ 其他功能模块 │ │
│ │ ├─ Tethering (网络共享) │ │
│ │ ├─ Nearby (WiFi Direct) │ │
│ │ ├─ Thread Network (IoT) │ │
│ │ └─ QoS 管理 │ │
│ └────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 内核接口层 (system_netd / native) │
│ ┌────────────────────────────────────────────────┐ │
│ │ netd (网络守护进程) │ │
│ │ ├─ 防火墙规则 │ │
│ │ ├─ 路由表操作 │ │
│ │ ├─ DNS 配置 │ │
│ │ ├─ 网络接口管理 │ │
│ │ └─ Tethering/VPN 实现 │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ ├─ 与 Linux kernel 通信 │
│ │ ├─ netlink socket │ │
│ │ ├─ iptables / nftables │ │
│ │ └─ iproute2 命令 │ │
│ └ │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 无线/蜂窝驱动层 (hardware_ril) │
│ ├─ WiFi 驱动 │
│ ├─ 蜂窝 RIL 驱动 │
│ ├─ Bluetooth 驱动 │
│ └─ Ethernet 驱动 │
└─────────────────────────────────────────────────────┘
1.2 关键仓库分布
让我深入各个核心仓库进行分析:
现在让我详细分析核心服务的实现:
好的,现在让我深入分析 NetworkStack 的各个层次。我会系统地展示完整的技术分析:
二、NetworkStack 启动流程与初始化
2.1 SystemServer 中的启动顺序
SystemServer.java 启动流程:
1. InitConnectivityModuleConnector (line 1988-1994)
├─ ConnectivityModuleConnector 初始化
└─ 用于加载可更新模块
2. InitNetworkStackClient (line 1996-2002)
├─ NetworkStackClient 初始化
└─ NetworkStack 的客户端接口
3. StartNetworkManagementService (line 2004-2011)
├─ NetworkManagementService.create()
├─ 负责与 netd 通信
└─ 处理底层网络管理
4. StartNetworkStatsService (line 2034-2039)
├─ 从 APEX 加载: com.android.tethering
├─ 类:NetworkStatsServiceInitializer
└─ 必须在 NetworkPolicyManager 之前启动
5. StartNetworkPolicyManagerService (line 2041-2049)
├─ NetworkPolicyManagerService
├─ 依赖 NetworkManagementService
└─ 管理网络策略和数据省流
6. StartWifiService (line 2055-2058)
├─ 从 APEX 加载: com.android.wifi
├─ 类:WifiService
└─ WiFi 服务
7. StartConnectivityService (line 2115-2122)
├─ 从 APEX 加载: com.android.tethering
├─ 类:ConnectivityServiceInitializer
├─ 依赖以上所有服务
└─ 核心网络管理服务
8. StartVpnManagerService (line 2133-2140)
├─ VpnManagerService.create()
├─ 管理 VPN 应用
└─ 与 ConnectivityService 配合
systemReady() 阶段:
│
├─ MakeNetworkManagementServiceReady (line 3115-3122)
├─ MakeConnectivityServiceReady (line 3129-3137)
├─ MakeVpnManagerServiceReady (line 3138-3142)
│
└─ StartNetworkStack (line 3189-3196)
├─ NetworkStackClient.getInstance().start()
└─ 真正启动网络栈
StartTethering (line 3198-3211)
├─ ConnectivityModuleConnector 启动 Tethering 模块
└─ 注册 Context.TETHERING_SERVICE
看核心的初始化启动代码,查看APEX模块加载:
现在让我继续深入分析核心模块的职责和数据流:
现在让我深入分析VPN、DNS、路由等关键模块,以及RIL层:
基于我的研究,现在让我生成完整的 NetworkStack 全面分析:
三、NetworkStack 核心模块职责详解
3.1 ConnectivityService - 网络管理核心
位置:packages_modules_Connectivity/service/src/com/android/server/ConnectivityService.java(超过14000行)
核心职责:
-
网络生命周期管理
- NetworkAgent 注册和注销
- 网络连接/断开/销毁
- 网络状态转换
-
网络请求匹配算法
- NetworkRequest 与 NetworkAgent 的关联
- 网络评分和排序(NetworkRanker)
- 默认网络选择
-
网络能力管理
NetworkCapabilities 属性: ├─ 传输类型 (TRANSPORT_WIFI, TRANSPORT_CELLULAR, TRANSPORT_VPN) ├─ 网络能力 (NET_CAPABILITY_INTERNET, VALIDATED, NOT_METERED等) ├─ 链路属性 (LinkProperties) └─ 网络信息 (NetworkInfo) -
网络验证流程
NetworkMonitor 验证流程: ├─ DNS 探测 ├─ HTTP/HTTPS 探测 ├─ Private DNS (DoH/DoT) 探测 ├─ 验证结果: │ ├─ VALID (完全连接) │ ├─ PARTIAL (部分连接) │ ├─ INVALID (无连接) │ └─ SKIP (跳过验证) └─ 验证状态影响网络分数 -
BPF 网络策略(Android 12+)
BPF (eBPF) 程序: ├─ 流量计费标记 (metered marking) ├─ 应用流量控制 └─ 系统级防火墙规则
3.2 NetworkAgentInfo - 网络代理信息容器
关键数据结构:
public class NetworkAgentInfo implements NetworkRanker.Scoreable {
// 网络标识
@NonNull public final Network network;
@NonNull public NetworkInfo networkInfo;
@NonNull public LinkProperties linkProperties;
@NonNull public NetworkCapabilities networkCapabilities;
// 网络状态时间戳
private long mCreatedTime; // netd 创建时间
private long mConnectedTime; // 连接时间
private long mDestroyedTime; // 销毁时间
private long mFirstValidationTime; // 首次验证通过时间
private long mCurrentValidationTime; // 最新验证时间
// 网络评分
private FullScore mScore; // 完整评分(包含 ConnectivityService 管理部分)
// 网络请求管理
private final SortedSet<InactivityTimer> mInactivityTimers;
private final List<NetworkRequest> mNetworkRequests;
// VPN 相关
public @Nullable volatile Network[] declaredUnderlyingNetworks;
// NAT64 转换
public Nat464Xlat clatd;
// QoS 回调追踪
private QosCallbackTracker mQosCallbackTracker;
}
网络状态机:
┌─────────────────┐
│ NASCENT │ 新建状态
│ (未连接) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ CONNECTED │ 已连接
│ (可提供服务) │
└────────┬────────┘
│
┌──────▼──────┐
│ LINGERS │ 保活状态
│ (等待销毁) │ (网络评分下降后)
└──────┬──────┘
│
▼
┌─────────────────┐
│ DESTROYED │ 已销毁
│ (临时保留) │
└─────────────────┘
3.3 DNS 管理模块 (DnsManager)
位置:packages_modules_Connectivity/service/src/com/android/server/connectivity/DnsManager.java
功能:
-
DNS 配置管理
DNS 设置来源: ├─ DHCP 获取的 DNS ├─ 手动配置的 DNS └─ Private DNS 服务器 -
Private DNS 支持
Private DNS 模式: ├─ PRIVATE_DNS_MODE_OFF (关闭) ├─ PRIVATE_DNS_MODE_OPPORTUNISTIC (机会性) │ └─ 尝试 DNS over HTTPS (DoH) │ └─ 尝试 DNS over TLS (DoT) └─ PRIVATE_DNS_MODE_PROVIDER_HOSTNAME (指定主机) └─ 强制使用特定的 Private DNS 服务器 -
DNS 验证流程
步骤: 1. 接收 Private DNS 配置变更 2. 解析 Private DNS 主机名 (hostname resolution) 3. 建立 DNS over TLS 连接验证 4. 将解析的 IP 地址配置到 netd 5. 执行 DNS 探测验证网络连接
3.4 路由管理模块 (RoutingCoordinator)
位置:packages_modules_Connectivity/service/src/com/android/server/connectivity/RoutingCoordinatorService.java
核心功能:
-
IPv4/IPv6 路由管理
├─ 默认路由配置 ├─ 进程级路由标记 (fwmark) ├─ 应用级策略路由 └─ VPN 路由拦截 -
NAT64 转换 (clatd)
NAT64 用途: ├─ 在仅 IPv6 网络上模拟 IPv4 连接 ├─ 将 IPv4 流量转换为 IPv6 └─ 将 IPv6 响应转换回 IPv4 实现: ├─ 系统守护进程:clatd ├─ TUN 虚拟网卡 └─ 数据包转换规则 -
netlink 通信
- 与 Linux kernel 网络栈通信
- 路由表更新
- 网络接口管理
3.5 VPN 管理系统
架构:
VPN 框架分层:
┌─────────────────────────┐
│ 应用层 VPN 服务 │
│ (如 OpenVPN、WireGuard) │
└────────────┬────────────┘
│
┌────────▼─────────┐
│ VpnService │ App 使用的 API
│ (Builder) │ 配置 VPN 连接
└────────┬─────────┘
│
┌────────────▼────────────────────┐
│ VPN 管理层 (frameworks_base) │
│ ├─ VpnManagerService │
│ └─ VpnManagerService.Lifecycle │
└────────────┬────────────────────┘
│
┌────────────▼─────────────────────┐
│ 系统集成层 (Connectivity) │
│ ├─ VPN 作为 NetworkAgent 注册 │
│ ├─ VPN NetworkCapabilities 设置 │
│ └─ VPN 选择算法 │
└────────────┬─────────────────────┘
│
┌────────────▼──────────────────┐
│ 内核层 │
│ ├─ TUN/TAP 虚拟网卡驱动 │
│ ├─ netd 路由和防火墙配置 │
│ └─ Linux 网络栈 │
└───────────────────────────────┘
VPN 工作流程:
1. VpnService.prepare() - 获取 VPN 权限
2. Builder.establish() - 创建 VPN 连接
├─ 创建 TUN 虚拟网卡
├─ 设置 IP 地址和路由
├─ 返回 ParcelFileDescriptor
3. 应用从 FD 读取传出数据包
4. 应用处理数据包(加密等)
5. 应用将响应数据写入 FD
6. 系统将数据包注入网络栈
7. VPN 断开时清理资源
Split Tunnel (分隧道) 支持:
declaredUnderlyingNetworks 机制:
VPN ─┬─→ WiFi ┐
│ ├─ 不同应用使用不同网络
└─→ Cellular┘
mDeclaredUnderlyingNetworks: Network[]
这个数组指定了该 VPN 下面的真实网络
ConnectivityService 使用这个信息决定数据包最终从哪个网络发送
3.6 系统网络守护进程 (netd)
位置:system_netd/
C++ 实现的核心功能:
-
防火墙规则管理
├─ iptables/nftables 规则 ├─ 背景应用限制 (background restrict) ├─ Data Saver 限制 └─ VPN 路由规则 -
DNS 解析守护
├─ DNS 查询代理 ├─ DNS 缓存(可选) └─ DNS 隐私支持 (DoH/DoT) -
网络接口管理
├─ 网络接口创建/销毁 ├─ IP 地址配置 ├─ 路由表操作 └─ MTU 设置 -
Tethering (网络共享)
├─ USB Tethering ├─ WiFi Hotspot ├─ Bluetooth NAP └─ Ethernet 共享
3.7 RIL 层 - 电话通信子系统
位置:hardware_ril/, frameworks_opt_telephony/
关键组件:
RIL (Radio Interface Layer) 架构:
┌──────────────────────────────────┐
│ Phone.java / DataConnection │
│ (应用与通信管理) │
└───────────────┬──────────────────┘
│
┌──────────▼──────────┐
│ RIL.java │ RIL 引擎
│ ├─ 请求/响应处理 │
│ └─ Unsolicited 事件│
└──────────┬──────────┘
│
┌─────────▼─────────┐
│ Hardware AIDL │ AIDL 接口
│ ├─ IRadio │ (与硬件通信)
│ └─ HAL Service │
└─────────┬─────────┘
│
┌─────────▼─────────┐
│ Modem 硬件 │ 无线电固件
│ ├─ BaseBand │
│ └─ 协议栈 │
└───────────────────┘
关键 RIL 请求:
RIL_REQUEST_SETUP_DATA_CALL
├─ 参数:accessNetworkType, dataProfile, allowRoaming等
├─ 响应:SetupDataCallResult
└─ 用途:建立数据连接
RIL_REQUEST_DEACTIVATE_DATA_CALL
├─ 参数:cid (connection ID)
└─ 用途:断开数据连接
RIL_REQUEST_GET_DATA_CALL_LIST
└─ 用途:查询当前数据连接列表
RIL Unsolicited 事件:
响应类型(主动上报):
├─ DATA_CALL_LIST_CHANGED
│ └─ Modem 数据连接状态变化
├─ VOICE_RADIO_TECH_CHANGED
│ └─ 无线电技术变化 (2G/3G/4G/5G)
├─ NETWORK_STATE_CHANGED
│ └─ 网络注册状态变化
└─ SIGNAL_STRENGTH
└─ 信号强度变化
3.8 WiFi 子系统交互
WiFi Service 与 Connectivity 交互:
WiFi Service
▼
registerNetworkAgent() → ConnectivityService
│
├─ NetworkCapabilities (WiFi, INTERNET等)
├─ LinkProperties (SSID, IP等)
└─ NetworkScore
事件回调:
├─ 连接成功 → broadcastNetworkStateChange()
├─ IP 获取 → updateLinkProperties()
├─ 验证结果 → updateNetworkInfo()
└─ 断开连接 → unregisterNetworkAgent()
四、NetworkStack 数据流和通信机制
4.1 网络连接建立流程
1. WiFi/蜂窝连接成功
▼
2. 驱动通知系统,创建网络接口
├─ wlan0 (WiFi)
├─ rndis0 (USB 蜂窝)
└─ ccmni0 (蜂窝)
▼
3. DHCP/静态 IP 配置 (通过 IpClient)
├─ 获得 IP 地址
├─ 获得 DNS 服务器
└─ 配置路由
▼
4. NetworkAgent 注册
├─ ConnectivityService 记录网络信息
├─ 创建 NetworkAgentInfo
└─ 设置初始 NetworkCapabilities
▼
5. NetworkMonitor 验证网络
├─ DNS 探测
├─ HTTP/HTTPS 探测
└─ 设置 VALIDATED capability
▼
6. 网络评分和选择
├─ 计算 NetworkScore
├─ 与其他网络比较
└─ 决定是否成为默认网络
▼
7. 网络状态通知应用
├─ NetworkCallback 回调
├─ CONNECTIVITY_ACTION 广播
└─ Settings 数据库更新
4.2 网络请求匹配流程
应用请求网络:
NetworkCapabilities.Builder()
.addTransportType(TRANSPORT_WIFI)
.addCapability(NET_CAPABILITY_INTERNET)
.build()
▼
connectivityManager.requestNetwork()
▼
ConnectivityService.requestNetwork()
▼
创建 NetworkRequestInfo (NRI)
▼
rematchAllNetworksAndRequests()
│
├─ 遍历所有网络 (NetworkAgentInfo)
├─ 测试能否满足请求
│ request.canBeSatisfiedBy(nai.networkCapabilities)
│
├─ NetworkRanker 评分
│ ├─ Transport priority (WiFi > Cellular)
│ ├─ Network validation state
│ ├─ Network score
│ └─ User preference
│
├─ 选择最佳网络 (Best Network)
│ mNetworkRanker.getBestNetwork(request, allNetworks, currentSatisfier)
│
└─ 分配给应用
Network → app
4.3 模块间通信模式
跨进程通信 (IPC):
ConnectivityService (system_server)
↕ Binder
┌───────┴─────────────────────────────┐
│ │
▼ ▼
INetworkAgent NetworkStackClient
(NetworkAgent 上报) (请求 NetworkStack 服务)
│
┌────────────┴────────────┐
│ │
▼ ▼
NetworkStack 进程 In-Process
(独立或 system_server) (Android 12+)
│
┌────────────┬┴────────┬────────────┐
▼ ▼ ▼ ▼
IpClient NetworkMonitor DnsResolver netd
DHCP/静态IP 验证网络 DNS解析 防火墙等
4.4 关键的 AIDL 接口
IConnectivityManager.aidl (系统 API)
├─ getDefaultNetwork()
├─ requestNetwork()
├─ unregisterNetworkCallback()
├─ getNetworkCapabilities()
└─ getNetworkTypeName()
INetworkAgent.aidl (NetworkAgent → ConnectivityService)
├─ sendNetworkCapabilities()
├─ sendLinkProperties()
├─ sendNetworkInfo()
├─ markConnected()
└─ markDisconnected()
INetworkStackConnector.aidl (ConnectivityService → NetworkStack)
├─ makeNetworkMonitor()
├─ makeIpClient()
├─ makeDhcpServer()
└─ fetchIpMemoryStore()
INetd.aidl (ConnectivityService → netd)
├─ interfaceGetCfg()
├─ networkCreatePhysical()
├─ routeAdd()
├─ firewallSetUidRule()
└─ tetherAddForward()
五、Android 15 新增特性
5.1 eBPF 网络策略增强
eBPF Programs 用于:
├─ Metered Network 流量标记
│ └─ 使用 BPF maps 存储流量统计
├─ 应用级防火墙规则
│ └─ 比传统 iptables 性能更好
├─ 网络切片支持
│ └─ 为不同应用提供 QoS
└─ 实时性能监测
└─ 低开销的网络统计收集
5.2 VPN 改进
VPN 新特性:
├─ Better split tunnel 支持
├─ App-by-app VPN 管理
├─ VPN per-app 权限控制
└─ VPN 网络隔离增强
5.3 网络切片 (Network Slicing)
5G 网络切片支持:
├─ URSP (UE Route Selection Policy)
├─ 流量描述符 (Traffic Descriptor)
├─ NSSAI (Network Slice Selection Assistance Information)
└─ 动态网络切片选择
5.4 Private DNS 改进
├─ DNS over QUIC (DoQ) 支持
├─ 多 DNS 服务器支持
├─ DNS 故障自动转移
└─ 企业 Private DNS 配置
六、性能优化和调试
6.1 网络诊断工具
ConnectivityDiagnosticsManager:
├─ NetworkValidationResult 检查
│ ├─ INVALID (验证失败)
│ ├─ VALID (完全连接)
│ ├─ PARTIALLY_VALID (部分连接)
│ └─ SKIPPED (跳过验证)
├─ 网络探测结果
│ ├─ DNS 探测
│ ├─ HTTP/HTTPS 探测
│ ├─ Private DNS 探测
│ └─ 流量检测
└─ 数据停滞检测 (Data Stall Detection)
├─ DNS 连续超时
└─ TCP 数据包丢失率
6.2 调试命令
# 查看网络状态
dumpsys connectivity
# 查看 NetworkMonitor 状态
dumpsys connectivity --verbose
# 查看网络接口
ip link show
# 查看路由表
ip route show
ip route show table all
# 查看 DNS 配置
getprop persist.sys.usb.config
getprop net.dns1
# 检查 VPN 状态
dumpsys wifi
dumpsys telephony
# 网络验证日志
logcat | grep NetworkMonitor
6.3 关键性能指标
KPI:
├─ 网络连接延迟 (<3s)
├─ 网络验证时间 (<5s)
├─ DNS 查询时间 (<100ms)
├─ 网络切换时间 (<500ms)
├─ 内存占用 (< 50MB)
└─ CPU 使用率 (< 5% idle)
总结:
NetworkStack 是一个高度解耦、模块化的系统架构,通过 APEX 模块实现了系统网络栈的可升级。核心 ConnectivityService 通过网络评分、请求匹配等机制选择最佳网络,支持 VPN、DNS、路由等高级功能。底层通过 RIL 层与蜂窝网络、通过驱动与 WiFi 等无线网络通信,最终通过 netd 与 Linux 内核网络栈交互。