在 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 模組化為方向,強化獨立更新與穩定性。