選取網路

本頁說明 Android 如何從同時可用的網路中選取網路。Android 滿足應用程式和系統網路要求的方式,以及 Android 為應用程式選擇預設網路的方式,都會受到這項網路選擇機制影響。

網路選取行為

本節說明搭載 Android 12 以上版本裝置的網路選取行為,以及搭載 Android 11 (API 級別 30) 以下版本裝置的網路選取行為。

Android 12

如果裝置搭載 Android 12 以上版本,Android 會使用 NetworkScore 類別,從可用網路中選取網路。這個類別包含用於做出政策決策的旗標。每個標記代表一個對網路選取作業而言很重要的網路屬性。

網路代理程式 (NetworkAgent) 會使用 POLICY_TRANSPORT_PRIMARY 標記指定 Android 偏好的網路 (如果有多個相同傳輸方式的網路)。舉例來說,雙 SIM 卡裝置的「設定」中會有切換選項,可供你選擇預設使用的 SIM 卡。在特定傳輸中,Android 會優先選擇具有 POLICY_TRANSPORT_PRIMARY 標記的網路,而非沒有該標記的網路。

網路代理程式會使用 POLICY_EXITING 旗標,識別預計會中斷連線的網路。舉例來說,如果使用者走出 Wi-Fi 網路範圍,網路品質就會下降。如果還有其他網路沒有這個旗標,Android 就會避免使用有這個旗標的網路。每個網路代理程式都能判斷網路何時會嚴重降級,需要視為退出。

網路代理程式也可以透過 NetworkScore 類別,使用 KEEP_CONNECTED_FOR_HANDOVER 標記和 NetworkScore.Builder.setKeepConnectedReason 方法,宣告 Android 應保持網路連線。這個 KEEP_CONNECTED_FOR_HANDOVER 標記有助於潛在網路。這個旗標可讓網路代理程式在次要 Wi-Fi STA 上啟動網路,但不會將該網路設為主要網路,直到 Android 評估網路效能為止。如果網路代理程式未宣告這個旗標,Android 會拆除預期網路,因為代理程式評估網路效能前,網路不會處理任何要求。

如果兩個聯播網都能放送特定請求,且政策相同,Android 會優先選擇放送請求的聯播網。如果沒有任何聯播網放送要求,Android 會選擇其中一個。在政策標記變更前,這個網路仍是首選。

網路選取功能是在 Android 開放原始碼計畫 (AOSP) 的連線模組中實作。網路選取政策邏輯位於 NetworkRanker 類別及其輔助類別中。這表示裝置製造商無法直接自訂網路選取程式碼。而是必須使用 NetworkScore 中的標記傳達網路相關資訊。

Android 11

如果裝置搭載 Android 11 以下版本,Android 會根據網路代理程式 (NetworkAgent) 傳送的整數選取網路。Android 會為每項要求選取可滿足要求且分數最高的網路。這個分數由網路代理程式傳送的整數,加上額外獎勵或懲罰組成。Android 會根據條件套用這些加分或扣分,例如網路是否經過驗證或是否為 VPN。網路代理程式會彼此同步,以制定政策決策。

如果兩個聯播網都能放送特定要求,且分數相同,系統未定義其行為。

NetworkScore 類別

NetworkScore 類別是網路選取功能的核心。這個類別包含可用旗標和 NetworkScore.Builder.setKeepConnectedReason 方法的 API 和說明文件。

您必須使用建構工具類別建構 NetworkScore 類別,並在初始化期間將其傳遞至 NetworkAgent 建構函式。您隨時可以使用 NetworkAgent#sendNetworkScore 方法更新網路分數。

網路代理程式實作範例

AOSP 包含各種網路代理程式的實作範例。以下列出實作範例:

  • TelephonyNetworkAgent:使用網路分數傳達行動網路政策。
  • ClientModeImpl.WifiNetworkAgent:使用網路分數傳達 Wi-Fi 網路的政策。這項實作方式會使用 POLICY_EXITING 標記,提供與舊版網路分數整數的回溯相容性。

升級至 Android 12 的裝置

如果裝置製造商要將裝置升級至 Android 12,就必須修改網路代理程式實作項目,才能使用 NetworkScore 類別。Android 11 以下版本使用的舊版整數會傳遞至 NetworkScore,但只會在 Android 12 中用於記錄和非迴歸用途。在 Android 12 中,裝置製造商必須使用 NetworkScore 標記表示變更。連線主線模組接著會使用這些標記來決定網路選擇。如果裝置製造商使用 Android 11 以下版本的程式碼,但建構時採用 Android 12 的實作方式,可能會發生建構錯誤,因為 Android 12 已移除更新舊版整數的方法。

對於使用內部 NetworkFactory 類別的網路代理程式,您必須在 NetworkScore 物件中表示分數篩選器,該物件代表工廠可建立的網路最強分數。這是因為在 Android 12 中,NetworkFactory 類別只會將符合所宣告分數篩選器的要求傳遞至 NetworkFactory,不像 Android 11 以下版本會傳遞所有要求。

您可以傳遞篩選器來簡化實作程序並節省電量,確保 NetworkFactory 不會處理所有要求。不過,如果自訂實作需要將所有要求傳遞至 NetworkFactory,您可以註冊 NetworkFactory.registerIgnoringScore,而非一般 NetworkFactory.register 方法。如果使用這個方法,請傳遞最能代表工廠可建立最佳分數的分數篩選器。這樣一來,系統就不會評估工廠無法滿足的要求,進而節省電量。

驗證

如要在搭載 Android 的裝置上驗證網路選取行為,請使用下列測試:

  • NetworkScoreTest CTS 測試
  • NetworkRanker 單元測試

如果導入方式不正確,應用程式使用 NetworkCallback 時,可能會傳回非預期的聯播網。包括選取裝置的預設網路 (系統在應用程式使用網路回呼時傳送的網路,例如使用 ConnectivityManager.registerDefaultNetworkCallback)。

實作方式有誤的另一個可能問題是電池耗電量過大。如果網路代理程式的分數不符合任何要求資格,就會發生這種情況,且代理程式會立即遭到終止。如果代理程式反覆啟動和關閉,可能會消耗大量電量。