在 Android 系統中,「網路連線」是所有 App 與雲端服務互動的關鍵。而這個核心職責由 Framework 層的 ConnectivityService 所負責。
它隸屬於 com.android.server,是 Android 網路子系統的中樞,協調 Wi-Fi、行動數據 (Mobile Data)、VPN、Tethering 等多種網路型態的切換與管理。
簡單說:
我們可以用下圖來理解 ConnectivityService 在整個網路架構中的位置:
+-----------------------------------------------------+
| Application 層 |
| (e.g., Chrome, YouTube, LINE) |
+--------------------------|--------------------------+
↓
+-----------------------------------------------------+
| Framework 層 (Connectivity Framework) |
| - ConnectivityManager (App API) |
| - ConnectivityService (System Service) |
| - NetworkPolicyManager, Tethering, VPN |
+--------------------------|--------------------------+
↓
+-----------------------------------------------------+
| Native 層 (netd / HAL / BPF) |
| - netd (Network Daemon) |
| - HAL modules (Wi-Fi HAL, RIL HAL) |
| - Kernel Network Stack (TCP/IP, routing, iface) |
+-----------------------------------------------------+
在這層架構中:
[NetworkAgent] → [NetworkRequest] → [ConnectivityService] → [NetworkCapabilities]
當 Wi-Fi 連上時,ConnectivityService 會:
mNetd.networkAddInterface(netId, iface);
mNetd.networkSetDefault(netId);
ConnectivityService 運作的核心概念,是 NetworkRequest / NetworkAgent 雙向配對。
App 或系統元件可以提交「網路需求」:
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()
connectivityManager.requestNetwork(request, callback)
這樣 ConnectivityService 會根據目前可用網路(如 Wi-Fi)建立連線並回調。
代表一個實際的網路連線,如 Wi-Fi 或 5G。
每個 NetworkAgent 會回報:
VPN 的邏輯較複雜,牽涉到 routing table 改寫與 app isolation。
在 Android 中,VPN 通常分為兩種:
類型 | 範例 | 描述 |
---|---|---|
Legacy VPN | PPTP、L2TP | 系統層實作 |
VpnService-based VPN | NordVPN、ProtonVPN | App 以 VpnService 實作,使用 Tun Interface |
+---------------------+
| App (VPN App) |
+----------|----------+
↓
[VpnService API] → [ConnectivityService]
↓
[netd / tun0]
↓
[Kernel Routing]
ConnectivityService 會建立 VPN 對應的 NetworkAgent,並在 routing table 將特定 UID 的流量導向 VPN tunnel。
TetheringService 與 ConnectivityService 密切協作,用來支援:
iptables -t nat -A POSTROUTING -o rmnet_data0 -j MASQUERADE
同時 NetworkPolicyManagerService 會施加用量控制,例如行動數據上限。
ConnectivityService 並非單獨運作,它與多個 System Service 互相依賴:
Service | 功能 |
---|---|
WifiService | 控制 Wi-Fi 開關與連線狀態 |
TelephonyRegistry | 監聽行動網路狀態 |
NetworkPolicyManager | 管理流量限制、QoS |
VpnManager | 管理 VPN 設定與連線 |
BatteryStatsService | 記錄網路耗電行為 |
NetworkMonitor 是 ConnectivityService 的子模組,用來偵測目前網路是否真的「可用」。
檢測邏輯:
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
ConnectivityService 會發送多種系統廣播:
廣播名稱 | 說明 |
---|---|
CONNECTIVITY_ACTION | 網路狀態變更(deprecated) |
NETWORK_STATE_CHANGED_ACTION | Wi-Fi 連線變化 |
VPN_STATE_CHANGED_ACTION | VPN 狀態更新 |
新的 API 則推薦使用 NetworkCallback(非廣播方式)。
案例流程:
[Wi-Fi Down] → [ConnectivityService] → [Switch to LTE] → [App Callback Updated]
開發者可透過以下方式檢視 Connectivity 狀態:
adb shell dumpsys connectivity
adb shell cmd connectivity monitor
adb logcat -b events | grep ConnectivityService
這些工具可協助分析網路切換、VPN 狀態、網路請求綁定情形。
ConnectivityService 代表了 Android 對「動態網路環境」的抽象化封裝。
它讓 App 開發者不需要關心具體的連線細節,而系統會根據:
可用性
穩定性
優先權
自動選擇最佳路線。
在 Android 13 之後,Google 更引入 Connectivity Module (com.android.connectivity) 模組化機制,讓 Wi-Fi、VPN、Tethering 等功能能透過 Mainline 更新,進一步提升系統安全與靈活性。
ConnectivityService 是 Android 網路中樞,管理 Wi-Fi、行動數據、VPN。
透過 NetworkRequest / NetworkAgent 框架動態管理網路。
與 netd、NetworkPolicy、VpnManager 等模組緊密互動。
新版本以 Mainline 模組化為方向,強化獨立更新與穩定性。