ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

第 35 章 网络与连接

第 35 章 网络与连接 Android 网络栈是 AOSP 中最复杂的子系统之一,上层覆盖 Java 框架 API,向下历经原生守护进程,最终抵达 Linux 内核网络原语。本章完整追踪网络数据包的流转路径,剖析管理网络连接的核心服务与模块,讲解 Android 从 Wi‑Fi 关联、DNS 解析到 VPN 隧道的全套处理逻辑。35.1 网络架构概览35.1.1 整体总览Android 网络采用分层架构,借鉴经典操作系统模型,并针对模块化、安全性、可更新性增加 Android 专属组件。最上层应用使用ConnectivityManager、WifiManager等 API;这些 API 通过 Binder IPC 与运行在system_server内的系统服务通信;系统服务再经由 Netlink 套接字、iptables/nftables 命令、BPF 程序,与原生守护进程(netd、DNS 解析器)以及 Linux 内核交互。35.1.2 核心组件汇总组件组件类型代码路径作用ConnectivityServiceJava 系统服务packages/modules/Connectivity/service/网络总管理核心NetworkAgentJava 框架类packages/modules/Connectivity/framework/承载网络与 ConnectivityService 通信NetworkFactoryJava 框架类packages/modules/Connectivity/staticlibs/创建 NetworkAgentnetd原生守护进程 (C++)system/netd/内核网络配置DnsResolver原生模块 (C++)packages/modules/DnsResolver/DNS 解析,支持 DoT/DoHWi‑Fi ServiceJava 系统服务packages/modules/Wifi/service/Wi‑Fi 管理NetworkStackMainline 模块packages/modules/NetworkStack/DHCP、网络有效性校验TetheringMainline 模块packages/modules/Connectivity/Tethering/USB/Wi‑Fi / 蓝牙网络共享35.1.3 Mainline 模块化从 Android 10(API 29)开始,Google 将网络组件拆分为可独立更新的 Mainline 模块。这是一项关键架构变更:把核心网络代码与节奏较慢的平台 OTA 解耦,允许通过应用商店推送安全补丁与功能更新。主要网络 Mainline 模块:Connectivity 模块(packages/modules/Connectivity/):包含 ConnectivityService、网络共享子系统以及相关框架代码。NetworkStack 模块(packages/modules/NetworkStack/):DHCP 客户端、网络有效性校验(强制门户检测)、IP 地址配置。Wi‑Fi 模块(packages/modules/Wifi/):整套 Wi‑Fi 子系统,含 WifiService、ClientModeImpl、扫描逻辑。DnsResolver 模块(packages/modules/DnsResolver/):原生 DNS 解析器,支持 DoT、DoH。每个模块以 APEX 包形式发布,是独立更新单元,具备版本管理、签名、回滚能力。Android 17 进一步演进:将原生网络二进制文件内置到模块内部,而不是仅存放在只读 system、vendor 分区。本章后续会介绍两个示例:Mainline 版 supplicant(/apex/com.android.wifi/bin/wpa_supplicant_mainline,Wi‑Fi APEX 内置的 wpa_supplicant 构建版本,见 35.27 节);Connectivity APEX 作为 APEX 内应用绑定的多代理 PAC 处理服务(见 35.26 节)。二者都允许 Google 通过 Play 系统更新推送安全敏感网络代码,无需 OEM 整机版本编译。35.1.4 网络 ID 与路由Android 中每一个活跃网络分配唯一网络 ID(netId),取值范围 100‑65535。该 ID 至关重要:统一绑定路由、DNS 配置、iptables 规则、socket 绑定。应用创建 socket 时,内核依靠 socket 上的 fwmark 标记(携带 netId)选择对应路由表。取自system/netd/server/NetworkController.cpp:// Keep these in sync with ConnectivityService.java. const unsigned MIN_NET_ID = 100; const unsigned MAX_NET_ID = 65535;框架通过NetIdManager完成 netId 分配。源码路径:packages/modules/Connectivity/service/src/com/android/server/NetIdManager.java35.1.5 数据通路:从应用到物理链路应用发送数据完整流程:fwmark 是 Android 按网络路由的核心机制。每个 socket 携带 32 位标记,位布局定义在system/netd/include/Fwmark.h的Fwmark联合体:网络 ID(0‑15 位)网络是否为应用显式指定(16 位)socket 是否不受 VPN 接管保护(17 位)权限位(18‑19 位)netd 内部FwmarkServer负责设置该标记。它是监听 UNIX 域套接字的SocketListener:客户端传递 socket 文件描述符,内部调用setsockopt(SOL_SOCKET, SO_MARK, ...)将计算得到的标记写入 socket;它不是 BPF 程序,也不是 cgroup 钩子。取自system/netd/server/FwmarkServer.cpp:314‑319fwmark.permission = permission; if (setsockopt(*socketFd, SOL_SOCKET, SO_MARK, fwmark.intValue, sizeof(fwmark.intValue)) == -1) { return -errno; }35.2 ConnectivityService35.2.1 概览ConnectivityService是 Android 网络的中枢。Java 代码超过 16000 行,是system_server中规模最大、最重要服务之一。管理全部网络生命周期、处理应用网络请求、网络评分与选网,协调原生守护进程完成路由与 DNS 配置。源码文件:packages/modules/Connectivity/service/src/com/android/server/ConnectivityService.java@TargetApi(Build.VERSION_CODES.S) public class ConnectivityService extends IConnectivityManager.Stub implements BroadcastReceiveHelper.Delegate { private static final String TAG = ConnectivityService.class.getSimpleName(); // ... // Default URL for captive portal detection private static final String DEFAULT_CAPTIVE_PORTAL_HTTP_URL = "http://connectivitycheck.gstatic.com/generate_204"; // How long to wait before switching back to a radio's default network private static final int RESTORE_DEFAULT_NETWORK_DELAY = 1 * 60 * 1000; // Default to 30s linger time‑out, and 5s for nascent network private static final String LINGER_DELAY_PROPERTY = "persist.netmon.linger"; private static final int DEFAULT_LINGER_DELAY_MS = 30_000; private static final int DEFAULT_NASCENT_DELAY_MS = 5_000; // The maximum number of network requests allowed per uid static final int MAX_NETWORK_REQUESTS_PER_UID = 100; // ... }35.2.2 Handler 线程模型ConnectivityService几乎全部业务运行在单条 Handler 线程。该设计目的:单线程模型避免复杂锁逻辑,不需要为大量网络、请求、回调相关数据结构加锁。消息由内部InternalHandler处理,事件包含:NetworkAgent 注册 / 注销Network 能力变更链路属性更新网络评分变更NetworkMonitor 有效性校验结果应用网络请求与回调35.2.3 NetworkAgentNetworkAgent是各类网络传输层(Wi‑Fi、蜂窝、以太网、VPN)与ConnectivityService之间的桥梁。每一条活跃网络连接对应唯一NetworkAgent实例。通过异步消息通道与ConnectivityService双向通信。源码:packages/modules/Connectivity/framework/src/android/net/NetworkAgent.java@SystemApi public abstract class NetworkAgent { @Nullable private volatile Network mNetwork; @Nullable private volatile INetworkAgentRegistry mRegistry; private final Handler mHandler; public static final int MIN_LINGER_TIMER_MS = 2000; // Message constants for communication with ConnectivityService public static final int CMD_SUSPECT_BAD = BASE; public static final int EVENT_NETWORK_INFO_CHANGED = BASE + 1; public static final int EVENT_NETWORK_CAPABILITIES_CHANGED = BASE + 2; public static final int EVENT_NETWORK_PROPERTIES_CHANGED = BASE + 3; public static final int EVENT_NETWORK_SCORE_CHANGED = BASE + 4; public static final int CMD_REPORT_NETWORK_STATUS = BASE + 7; public static final int CMD_START_SOCKET_KEEPALIVE = BASE + 11; public static final int CMD_STOP_SOCKET_KEEPALIVE = BASE + 12; // ... }NetworkAgent 生命周期:​传输层必须实现的关键方法:方法调用时机用途onNetworkUnwanted()ConnectivityService 不再需要该网络传输层断开网络onBandwidthUpdateRequested()需要更新吞吐能力刷新带宽信息onValidationStatus()网络校验成功 / 失败传输层调整行为onSignalStrengthThresholdsUpdated()信号阈值变更调整信号监测onStartSocketKeepalive()应用保活请求尽可能硬件卸载保活onStopSocketKeepalive()停止保活关闭硬件保活卸载onSaveAcceptUnvalidated()用户接受未校验网络保存用户偏好35.2.4 NetworkFactoryNetworkAgent代表一条已经存在的网络;NetworkFactory代表能够创建网络的能力。每种网络传输向ConnectivityService注册一个 Factory,声明自身可以提供的网络类型。源码:packages/modules/Connectivity/staticlibs/device/android/net/NetworkFactory.javapublic class NetworkFactory { static final boolean DBG = true; final NetworkFactoryShim mImpl; public NetworkFactory(Looper looper, Context context, String logTag, @Nullable final NetworkCapabilities filter) { LOG_TAG = logTag; if (isAtLeastS()) { mImpl = new NetworkFactoryImpl(this, looper, context, filter); } else { mImpl = new NetworkFactoryLegacyImpl(this, looper, context, filter); } } public static final int CMD_REQUEST_NETWORK = 1; public static final int CMD_CANCEL_REQUEST = 2; // ... }当应用发出NetworkRequest,ConnectivityService遍历全部已注册 Factory。若 Factory 声明的能力匹配请求,向 Factory 发送CMD_REQUEST_NETWORK消息;Factory 决定拉起新网络(创建 NetworkAgent)或者忽略请求。35.2.5 NetworkRequest 与 NetworkCapabilities应用通过NetworkRequest表达网络需求,内部封装NetworkCapabilities约束。 源码:packages/modules/Connectivity/framework/src/android/net/NetworkRequest.javaNetworkRequest包含:必需能力:网络必须具备(例如NET_CAPABILITY_INTERNET)禁止能力:网络不能具备;例如禁止NET_CAPABILITY_NOT_METERED代表允许按流量计费网络传输类型:允许的承载(Wi‑Fi、蜂窝等)网络说明符:用于指定特定网络,例如指定某一个 Wi‑Fi SSIDNetworkCapabilities是系统中描述网络最丰富的数据结构,编码网络数十项属性。 源码:packages/modules/Connectivity/framework/src/android/net/NetworkCapabilities.java关键能力常量:能力含义NET_CAPABILITY_INTERNET具备互联网访问NET_CAPABILITY_VALIDATED系统确认互联网连通正常NET_CAPABILITY_NOT_METERED不计流量计费NET_CAPABILITY_NOT_VPN非 VPN 网络NET_CAPABILITY_NOT_ROAMING非漫游NET_CAPABILITY_NOT_CONGESTED网络无拥塞NET_CAPABILITY_NOT_SUSPENDED网络未暂停NET_CAPABILITY_CAPTIVE_PORTAL处于强制门户页面NET_CAPABILITY_PARTIAL_CONNECTIVITY部分连通NET_CAPABILITY_MMS支持彩信NET_CAPABILITY_ENTERPRISE企业网络NET_CAPABILITY_LOCAL_NETWORK本地网络(如 Thread)传输类型:传输类型说明TRANSPORT_CELLULAR移动数据 LTE/5GTRANSPORT_WIFIWi‑FiTRANSPORT_BLUETOOTH蓝牙 PANTRANSPORT_ETHERNET有线以太网TRANSPORT_VPN虚拟专用网络TRANSPORT_WIFI_AWAREWi‑Fi Aware(NAN)TRANSPORT_LOWPAN低功耗广域网 LoWPANTRANSPORT_TEST测试网络TRANSPORT_SATELLITE卫星网络TRANSPORT_THREADThread 网状网络35.2.6 网络评分与选网逻辑多条网络同时满足请求时,ConnectivityService选出最优网络。选网算法随 Android 版本迭代变化巨大。旧版评分(Android12 之前):简单整数,数值越高优先级越高。Wi‑Fi 默认 60,蜂窝 50。现代评分(Android12+):基于策略的NetworkScore,多维度综合。//取自 NetworkAgent.java: public static final int WIFI_BASE_SCORE = 60;rematchAllNetworksAndRequests()是选网核心函数。每次网络发生重大变更都会执行;遍历全部活跃请求,为每个请求寻找最佳网络。​评分策略维度:传输载体主网络优先已校验网络优先于未校验网络不计流量网络优先尊重用户手动选择网络VPN 拥有独立评分规则35.2.7 LinkPropertiesLinkProperties描述网络 IP 层全部配置:IPv4/IPv6 地址DNS 服务器路由表条目接口名(wlan0、rmnet0)MTUHTTP 代理配置NAT64 前缀(仅 IPv6 网络)当 NetworkAgent 更新LinkProperties,ConnectivityService 将路由、DNS 配置下发到 netd。35.2.8 网络生命周期事件与回调应用通过注册回调接收网络状态变更。ConnectivityService 支持丰富回调事件。 取自 ConnectivityService 导入片段:import static android.net.ConnectivityManager.CALLBACK_AVAILABLE; import static android.net.ConnectivityManager.CALLBACK_BLK_CHANGED; import static android.net.ConnectivityManager.CALLBACK_CAP_CHANGED; import static android.net.ConnectivityManager.CALLBACK_IP_CHANGED; import static android.net.ConnectivityManager.CALLBACK_LOCAL_NETWORK_INFO_CHANGED; import static android.net.ConnectivityManager.CALLBACK_LOSING; import static android.net.ConnectivityManager.CALLBACK_LOST; import static android.net.ConnectivityManager.CALLBACK_PRECHECK; import static android.net.ConnectivityManager.CALLBACK_SUSPENDED; import static android.net.ConnectivityManager.CALLBACK_RESUMED;典型网络连接回调生命周期:35.2.9 基于 BPF 的流量管控新版 Android 越来越多地使用 eBPF(扩展伯克利数据包过滤器)程序处理流量管控,逐步替代传统 iptables 规则。BPF 挂载在 cgroup 钩子,实现按 UID 流量策略。取自 ConnectivityService 导入片段:// Source: packages/modules/Connectivity/service/src/com/android/server/ConnectivityService.java // BPF program attachment points import static com.android.net.module.util.BpfUtils.BPF_CGROUP_GETSOCKOPT; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_INET4_BIND; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_INET4_CONNECT; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_INET6_BIND; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_INET6_CONNECT; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_INET_EGRESS; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_INET_INGRESS; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_INET_SOCK_CREATE; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_INET_SOCK_RELEASE; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_SETSOCKOPT; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_UDP4_RECVMSG; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_UDP4_SENDMSG; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_UDP6_RECVMSG; import static com.android.net.module.util.BpfUtils.BPF_CGROUP_UDP6_SENDMSG;BPF 程序实现功能:按 UID 流量统计:统计每个 UID 收发字节数防火墙执行:按 UID / 链拦截放行流量Socket 标记:Socket 创建时写入 fwmark省流量模式:按流量计费网络限制后台数据带宽控制:按网卡配额限速Connectivity 模块中BpfNetMaps管理 BPF 映射表,替换大量传统 iptables 逻辑。源码:packages/modules/Connectivity/service/src/com/android/server/BpfNetMaps.java35.2.10 冻结应用处理ConnectivityService 对冻结(缓存)应用做特殊处理。当 ActivityManager 冻结应用,网络回调不会直接分发,而是进入队列,避免不必要唤醒。取自 ConnectivityService 导入片段:// Source: ConnectivityService.java import block import static com.android.server.connectivity.ConnectivityFlags.QUEUE_CALLBACKS_FOR_FROZEN_APPS;应用解除冻结后,排队回调按顺序投递,保证应用获取正确的网络状态视图。35.3 Wi‑Fi 框架35.3.1 架构概览AOSP Wi‑Fi 子系统非常复杂,管理无线射频、扫描、连接、SoftAP 热点、Wi‑Fi Direct (P2P)、Wi‑Fi Aware (NAN)。Android12 起整套 Wi‑Fi 栈作为 Mainline 模块发布。模块根目录:packages/modules/Wifi/35.3.2 WifiServiceImplWifiServiceImpl是 Binder 对外服务,实现IWifiManager。接收应用全部公开 API 调用,将工作委派给内部组件。源码:packages/modules/Wifi/service/java/com/android/server/wifi/WifiServiceImpl.java// WifiServiceImpl handles dozens of Wi‑Fi manager APIs including: // - Scan management (IScanResultsCallback) // - Network suggestions (ISuggestionConnectionStatusListener) // - SoftAP control (ISoftApCallback) // - P2P operations // - Traffic state monitoring (ITrafficStateCallback) // - Verbose logging control // - DPP (Device Provisioning Protocol) // - TWT (Target Wake Time)主要职责:权限校验(定位、Wi‑Fi 状态变更等)API 入参校验模式变更请求委派至ActiveModeWarden广播 Wi‑Fi 状态变更管理仅本地网络热点请求35.3.3 ClientModeImpl:Wi‑Fi 状态机ClientModeImpl是 Wi‑Fi 连接核心工作类,继承StateMachine;完整管理 Wi‑Fi 连接生命周期:扫描、鉴权、DHCP 直至完全连通。源码:packages/modules/Wifi/service/java/com/android/server/wifi/ClientModeImpl.javapublic class ClientModeImpl extends StateMachine implements ClientMode { // Roles for this client mode interface // ROLE_CLIENT_PRIMARY - the main STA interface // ROLE_CLIENT_LOCAL_ONLY - local‑only connection // ROLE_CLIENT_SECONDARY_LONG_LIVED - persistent secondary // ROLE_CLIENT_SECONDARY_TRANSIENT - temporary secondary (MBB) // ROLE_CLIENT_SCAN_ONLY - scan‑only mode // ... }状态机关键状态:​State descriptions:StateDescriptionDefaultStateWi-Fi is off or initializingConnectableStateWi-Fi is on and ready to connectDisconnectedStateNot associated with any APL2ConnectingStateAttempting 802.11 associationL2ConnectedStateAssociated at L2, waiting for L3WaitBeforeL3ProvisioningStateBrief pause before IP provisioningL3ProvisioningStateRunning DHCP or static IP configL3ConnectedStateFull IP connectivity establishedConnectedStateStable connected stateRoamingStateTransitioning between APs35.3.4 WifiNative:HAL 桥接层WifiNative作为 Java Wi‑Fi 框架与原生 Wi‑Fi HAL 的接口。管理硬件接口,转发 wpa_supplicant 操作,处理扫描结果。源码:packages/modules/Wifi/service/java/com/android/server/wifi/WifiNative.java// WifiNative creates and manages different interface types: // HDM_CREATE_IFACE_STA - Station (client) interface // HDM_CREATE_IFACE_AP - Access Point interface // HDM_CREATE_IFACE_AP_BRIDGE - Bridged AP (dual‑band) // HDM_CREATE_IFACE_P2P - Wi‑Fi Direct interface // HDM_CREATE_IFACE_NAN - Wi‑Fi Aware interfaceHAL 通信路径:​35.3.5 wpa_supplicant 集成Android 使用行业标准wpa_supplicant完成 802.11 鉴权。SupplicantStaIfaceHal通过 AIDL 接口与 wpa_supplicant 通信,处理:WPA/WPA2/WPA3 鉴权802.1X 企业认证(EAP‑TLS、EAP‑TTLS、EAP‑PEAP、EAP‑SIM 等)FILS 快速链路建立,缩短连接耗时OWE 开放网络加密SAE 对等同时认证(WPA3)DPP 设备配网协议SupplicantStaIfaceHal不绑定固定后端。工厂方法createStaIfaceHalMockable()严格按优先级选择可用后端:AIDL mainline 实现(Wi‑Fi APEX 内内置 supplicant 二进制,见 35.27)vendor 分区的 AIDL vendor 实现旧版 HIDL 实现逐个调用isServiceAvailable()/serviceDeclared()探测,取第一个可用。Wi‑Fi Direct 的SupplicantP2pIfaceHal采用完全相同三级选择逻辑。35.3.6 网络选择逻辑WifiNetworkSelector评估扫描结果,选出最优 AP 进行连接。评估因素:用户保存网络优先级RSSI 信号强度(区分 2.4G/5G/6G 频段加权)安全类型,优先高安全历史连接质量统计App 提供的网络建议设备管理员企业策略因故障临时拉黑网络35.3.7 SoftAP(移动热点)SoftApManager实现移动热点,自带状态机管理 AP 接口完整生命周期。源码:packages/modules/Wifi/service/java/com/android/server/wifi/SoftApManager.javapublic class SoftApManager implements ActiveModeManager { private static final String TAG = "SoftApManager"; // SoftAP manages the AP mode lifecycle: // - Interface creation (via WifiNative/HalDeviceManager) // - Channel selection (considering coexistence) // - Client connection/disconnection tracking // - Bridged AP mode (dual‑band simultaneous) // - Idle timeout management // ... }SoftAP 能力:双频桥接 AP:同时开启 2.4GHz 与 5GHz客户端管理:已连接设备跟踪,最大客户端数量限制共存管理:CoexManager处理与蜂窝射频干扰自动关闭:无客户端可配置闲置超时热点 WPA3‑SAE 安全支持AP BSSID MAC 随机化,保护隐私35.3.8 Wi‑Fi Direct(P2P)Wi‑Fi Direct 允许设备直连,不需要路由器 AP。实现代码路径:packages/modules/Wifi/service/java/com/android/server/wifi/p2p/;由WifiP2pServiceImpl管理。P2P 连接流程:​35.3.9 MLO 多链路操作与 Wi‑Fi 7新版 AOSP 支持 Wi‑Fi7(802.11be),包含 MLO 多链路操作。框架中MloLink类代表 MLO 连接下每一条独立链路。// From ClientModeImpl.java imports import android.net.wifi.MloLink;MLO 允许设备在多信道、多频段同时收发,显著提升吞吐,降低时延。35.4 netd(网络守护进程)35.4.1 概览netd 是 C++ 编写的原生守护进程,代表 Android 框架配置 Linux 内核网络子系统。高权限进程;路由表操作、防火墙规则、带宽管控、网卡配置的主要入口。源码目录:system/netd/35.4.2 NetdNativeService:Binder 接口NetdNativeService通过 AIDL Binder 对外暴露 netd 全部能力,是框架层调用 netd 的唯一入口。源码:system/netd/server/NetdNativeService.hclass NetdNativeService : public BinderServiceNetdNativeService, public BnNetd { public: NetdNativeService(); static status_t start(); static char const* getServiceName() { return "netd"; } // Firewall commands binder::Status firewallReplaceUidChain(const std::string chainName, bool isAllowlist, const std::vectorint32_t uids, bool* ret) override; binder::Status firewallSetFirewallType(int32_t firewallType) override; binder::Status firewallSetInterfaceRule(const std::string ifName, int32_t firewallRule) override; binder::Status firewallSetUidRule(int32_t childChain, int32_t uid, int32_t firewallRule) override; // Bandwidth control commands binder::Status bandwidthEnableDataSaver(bool enable, bool *ret) override; binder::Status bandwidthSetInterfaceQuota(const std::string ifName, int64_t bytes) override; binder::Status bandwidthSetGlobalAlert(int64_t bytes) override; binder::Status bandwidthAddNaughtyApp(int32_t uid) override; binder::Status bandwidthAddNiceApp(int32_t uid) override; // Network and routing commands binder::Status networkCreate(const NativeNetworkConfig config) override; binder::Status networkDestroy(int32_t netId) override; binder::Status networkAddInterface(int32_t netId, const std::string iface) override; binder::Status networkAddRoute(int32_t netId, const std::string ifName, const std::string destination, const std::string nextHop) override; binder::Status networkSetDefault(int32_t netId) override; // Socket operations binder::Status socketDestroy(const std::vectorUidRangeParcel uids, const std::vectorint32_t skipUids) override; // ... };35.4.3 NetworkController:路由与网络抽象NetworkController负责 netd 内部网络抽象创建与配置。每一种网络(物理、虚拟、本地、不可达)拥有独立路由表与策略路由规则。源码:system/netd/server/NetworkController.cpp// THREAD‑SAFETY // The methods in this file are called from multiple threads (from // CommandListener, FwmarkServer and DnsProxyListener). So, all accesses // to shared state are guarded by a lock. class NetworkController::DelegateImpl : public PhysicalNetwork::Delegate { public: explicit DelegateImpl(NetworkController* networkController); [[nodiscard]] int modifyFallthrough(unsigned vpnNetId, const std::string physicalInterface, Permission permission, bool add); // ... };netd 内部网络类型:类型类名用途PhysicalPhysicalNetworkWi‑Fi、蜂窝、以太网物理网络VirtualVirtualNetworkVPN 虚拟网络LocalLocalNetworklocalhost与本地回环接口UnreachableUnreachableNetwork拒绝数据包,阻断流量DummyDummyNetwork测试 / 占位虚拟网络35.4.4 iptables 链架构netd 把 iptables 规则组织成有序自定义链。顺序至关重要,源码中明确标注。 源码:system/netd/server/Controllers.cpp// ORDERING IS CRITICAL, AND SHOULD BE TRIPLE‑CHECKED WITH EACH CHANGE. static const std::vectorconst char* FILTER_INPUT = { OEM_IPTABLES_FILTER_INPUT, BandwidthController::LOCAL_INPUT, // "bw_INPUT" FirewallController::LOCAL_INPUT, // "fw_INPUT" }; static const std::vectorconst char* FILTER_FORWARD = { OEM_IPTABLES_FILTER_FORWARD, FirewallController::LOCAL_FORWARD, // "fw_FORWARD" BandwidthController::LOCAL_FORWARD, // "bw_FORWARD" TetherController::LOCAL_FORWARD, // tethering forwarding }; static const std::vectorconst char* FILTER_OUTPUT = { OEM_IPTABLES_FILTER_OUTPUT, FirewallController::LOCAL_OUTPUT, // "fw_OUTPUT" StrictController::LOCAL_OUTPUT, // cleartext enforcement BandwidthController::LOCAL_OUTPUT, // "bw_OUTPUT" }; static const std::vectorconst char* RAW_PREROUTING = { IdletimerController::LOCAL_RAW_PREROUTING, BandwidthController::LOCAL_RAW_PREROUTING, TetherController::LOCAL_RAW_PREROUTING, }; static const std::vectorconst char* MANGLE_POSTROUTING = { OEM_IPTABLES_MANGLE_POSTROUTING, BandwidthController::LOCAL_MANGLE_POSTROUTING, IdletimerController::LOCAL_MANGLE_POSTROUTING, }; static const std::vectorconst char* MANGLE_INPUT = { CONNMARK_MANGLE_INPUT, WakeupController::LOCAL_MANGLE_INPUT, RouteController::LOCAL_MANGLE_INPUT, };入站数据包链执行顺序:​35.4.5 BandwidthControllerBandwidthController
返回列表