選取網路

本頁說明 Android 如何在同時可用的網路之間進行選擇。這個網路選取機制會影響 Android 如何滿足應用程式和系統網路要求,並影響選擇應用程式的預設網路的方式。

網路選取行為

本節說明搭載 Android 12 以上版本的裝置,以及搭載 Android 11 以下版本的裝置,網路選擇行為。

Android 12

對於搭載 Android 12 以上版本的裝置,Android 會使用 NetworkScore 類別,在可用的網路之間進行選擇。這個類別包含做出政策決策所需的多個標記。每個標記在語意上都代表聯播網的屬性,這些屬性對於聯播網選擇至關重要。

網路代理程式 (NetworkAgent) 會使用 POLICY_TRANSPORT_PRIMARY 標記,在有多個相同傳輸的網路時指定偏好的網路。這類情況的典型例子是雙 SIM 卡裝置,其中的設定有個切換鈕,可讓使用者選擇預設要使用的 SIM 卡。在特定傳輸方式中,Android 會優先使用帶有 POLICY_TRANSPORT_PRIMARY 標記的網路,而非沒有標記的網路。

網路代理程式會使用 POLICY_EXITING 標記,識別即將中斷連線的網路。這類情況的典型例子是,當使用者離開 Wi-Fi 網路範圍時,網路品質會降低。如果有其他沒有此標記的網路可用,Android 就會避免使用有此標記的網路。每個個別網路代理程式都可以判斷網路何時降級到足以視為退出。

NetworkScore 類別也允許網路代理程式使用 KEEP_CONNECTED_FOR_HANDOVER 標記和 NetworkScore.Builder.setKeepConnectedReason 方法,宣告網路會持續運作。這個 KEEP_CONNECTED_FOR_HANDOVER 標記適用於潛在網路,可讓網路代理程式在次要 Wi-Fi STA 上啟用網路,但在評估網路效能前,不將其設為主要網路。如果網路代理程式未宣告這個標記,則在代理程式有機會評估網路效能之前,潛在網路會因未服務任何要求而拆除。

如果兩個聯播網都能放送特定要求,且從政策角度來看相當,系統會優先選擇目前正在放送要求的聯播網。如果沒有任何聯播網放送請求,系統會選擇其中一個,並在政策標記變更前,持續將該聯播網設為優先。

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

Android 11

針對執行 Android 11 以下版本的裝置,Android 會根據網路代理程式 (NetworkAgent) 實作傳送的簡單整數,執行網路選取作業。對於每項要求,Android 會選取可滿足要求的最高數值分數網路。這個數值分數由網路代理程式傳送的整數,加上根據多項條件 (例如網路是否已驗證,或網路是否為 VPN) 給予的額外獎勵或處罰所組成。個別網路代理程式會彼此同步,以便做出政策決定。

如果兩個聯播網都能放送特定要求,且有相同的數值分數,則系統不會定義行為。

NetworkScore 類別

網路選取功能的核心類別為 NetworkScore。這個類別包含可用旗標和 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 標記來表示所需的變更。接著,Connectivity Mainline 模組會使用標記來決定網路。如果裝置製造商使用 Android 11 以下版本的程式碼,但以 Android 12 的實作方式進行建構,則可能會發生建構錯誤,因為更新舊版整數的方法已在 Android 12 中移除。

對於使用內部 NetworkFactory 類別的網路代理程式,必須在 NetworkScore 物件中表示其分數篩選器,以代表工廠可建立的網路最強分數。這是因為在 Android 12 中,NetworkFactory 類別只會傳送符合 NetworkFactory 所聲明的分數篩選器要求,而非 Android 11 以下版本的所有要求。

建議您傳遞篩選器,以便輕鬆實作並節省電池電量,這樣就不必將所有要求都傳遞至 NetworkFactory。不過,如果您的自訂實作需要將所有要求傳遞至 NetworkFactory,您可以註冊 NetworkFactory.registerIgnoringScore,而非一般 NetworkFactory.register 方法。如果使用這個方法,建議您傳遞分數篩選器,以便最準確地代表工廠可建立的最佳分數,藉此不評估工廠無法滿足的要求,進而節省電池電量。

驗證

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

實作方式不正確,可能會導致應用程式在使用 NetworkCallback 時,傳回非預期的網路,包括選取裝置的預設網路 (當應用程式使用含有 ConnectivityManager.registerDefaultNetworkCallback 的網路回呼時,系統會傳送的網路)。

不正確實作可能導致的另一個問題,是網路代理程式會以分數啟動,但分數不足以讓網路代理程式符合任何要求,並在之後立即拆除,導致嚴重耗電。如果服務專員不斷啟動和關閉,可能會耗用大量電力。