iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0

ConnectivityService:Wi-Fi、Mobile Data、VPN

ConnectivityService

在 Android 系統中,「網路連線」是所有 App 與雲端服務互動的關鍵。而這個核心職責由 Framework 層的 ConnectivityService 所負責。
它隸屬於 com.android.server,是 Android 網路子系統的中樞,協調 Wi-Fi、行動數據 (Mobile Data)、VPN、Tethering 等多種網路型態的切換與管理。
簡單說:

  • ConnectivityService 就像 Android 裡的「交通控制中心」,負責監控各種「道路」(Wi-Fi、4G、5G、VPN)狀態,並選擇一條最佳路線給 App 使用。

overview

我們可以用下圖來理解 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)    |
+-----------------------------------------------------+

在這層架構中:

  • App → ConnectivityManager:透過 API 查詢網路狀態、註冊 callback。
  • ConnectivityManager → ConnectivityService:透過 Binder IPC 與 System Server 交互。
  • ConnectivityService → netd / HAL:透過 socket、JNI 或 HIDL 操作底層網路設備。

ConnectivityService 的核心職責

  1. 網路狀態監控與選擇
  • ConnectivityService 會追蹤所有可用的網路介面(Wi-Fi、Cellular、Ethernet、VPN…),並依據優先順序或使用者設定決定「哪個網路被使用」。
[NetworkAgent] → [NetworkRequest] → [ConnectivityService] → [NetworkCapabilities]

當 Wi-Fi 連上時,ConnectivityService 會:

  • 驗證網路可用性(例如是否有網際網路)。
  • 通知所有註冊的 App。
  • 根據權重選擇最佳的網路給應用程式。
  1. 與 netd 的協作
  • netd 是位於 native 層的守護程序,負責執行實際的網路設定操作,例如:
    • 建立 routing table。
    • 設定防火牆(iptables)。
    • 管理 DNS。
    • 處理 VPN 導向。
    • ConnectivityService 透過 INetd.aidl 與 netd 溝通。
mNetd.networkAddInterface(netId, iface);
mNetd.networkSetDefault(netId);
  1. 處理多種網路型態
    (1) Wi-Fi 網路
  • 由 WifiService / WifiManager 管理連線細節。
  • ConnectivityService 主要負責監控其連線狀態變化(NetworkCapabilities.TRANSPORT_WIFI)並切換預設網路。
  • Wi-Fi 的事件會透過 NetworkMonitor 進行網際網路可用性檢查(HTTP ping 檢測)。
    (2) Mobile Data (Cellular)
  • 行動網路則由 Telephony Framework 提供資料連線。
  • ConnectivityService 通過 TelephonyNetworkFactory 監控 baseband 狀態,並建立 Mobile NetworkAgent。
    (3) VPN
  • VPN 的實作是由 VpnService 與 Vpn 類別完成。
  • ConnectivityService 則管理 VPN 的 lifecycle、routing、以及 UID binding(哪些 App 流量走 VPN)。

NetworkRequest 與 NetworkAgent 機制

ConnectivityService 運作的核心概念,是 NetworkRequest / NetworkAgent 雙向配對。

NetworkRequest

App 或系統元件可以提交「網路需求」:

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .build()
connectivityManager.requestNetwork(request, callback)

這樣 ConnectivityService 會根據目前可用網路(如 Wi-Fi)建立連線並回調。

NetworkAgent

代表一個實際的網路連線,如 Wi-Fi 或 5G。
每個 NetworkAgent 會回報:

  • NetworkCapabilities(能力,如速度、是否有網際網路)
  • LinkProperties(IP、DNS、路由)
  • NetworkInfo(狀態)
    ConnectivityService 根據多個 NetworkAgent 狀態進行網路切換。

VPN 管理與應用導向分流

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。

Tethering(網路共用)與政策控制

TetheringService 與 ConnectivityService 密切協作,用來支援:

  • USB 熱點
  • Wi-Fi 熱點
  • Bluetooth 網路共用
    在啟用熱點時,ConnectivityService 會呼叫 netd 設定 NAT 規則:
iptables -t nat -A POSTROUTING -o rmnet_data0 -j MASQUERADE

同時 NetworkPolicyManagerService 會施加用量控制,例如行動數據上限。

與其他服務的互動關係

ConnectivityService 並非單獨運作,它與多個 System Service 互相依賴:

Service 功能
WifiService 控制 Wi-Fi 開關與連線狀態
TelephonyRegistry 監聽行動網路狀態
NetworkPolicyManager 管理流量限制、QoS
VpnManager 管理 VPN 設定與連線
BatteryStatsService 記錄網路耗電行為

Network Monitor:網際網路可用性檢查

NetworkMonitor 是 ConnectivityService 的子模組,用來偵測目前網路是否真的「可用」。
檢測邏輯:

  1. 嘗試存取 http://connectivitycheck.gstatic.com/generate_204
  2. 若 HTTP 204 回應 → 表示網路可上網。
  3. 若被攔截(如 Captive Portal)→ 通知使用者登入。
    這部分在 AOSP 中位於:
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java

事件通知與 Broadcasts

ConnectivityService 會發送多種系統廣播:

廣播名稱 說明
CONNECTIVITY_ACTION 網路狀態變更(deprecated)
NETWORK_STATE_CHANGED_ACTION Wi-Fi 連線變化
VPN_STATE_CHANGED_ACTION VPN 狀態更新

新的 API 則推薦使用 NetworkCallback(非廣播方式)。

use case: Wi-Fi switch to mobile data

案例流程:

  1. 使用者離開 Wi-Fi 覆蓋區。
  2. WifiNetworkAgent 通知 ConnectivityService → 網路失效。
  3. ConnectivityService 檢查 CellularNetworkAgent 狀態。
  4. 若可用 → 自動切換。
  5. NetworkMonitor 驗證網際網路 → 回報 CONNECTED。
[Wi-Fi Down] → [ConnectivityService] → [Switch to LTE] → [App Callback Updated]

how to debug

開發者可透過以下方式檢視 Connectivity 狀態:

adb shell dumpsys connectivity
adb shell cmd connectivity monitor
adb logcat -b events | grep ConnectivityService

這些工具可協助分析網路切換、VPN 狀態、網路請求綁定情形。

ConnectivityService 的核心價值

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


上一篇
#22
下一篇
#24
系列文
安豬複習26
  1. 22
    #21
  2. 23
    #22
  3. 24
    #23
  4. 25
    #24
  5. 26
    #25
完整目錄
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言