本頁說明 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
方法更新網路分數。
網路代理程式實作範例
Android 開放原始碼計畫包含各種網路代理程式的實作範例。以下是實作範例:
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 裝置上的網路選取行為,請使用下列測試:
NetworkScoreTest
CTS 測試NetworkRanker
單元測試
如果實作錯誤,可能會導致非預期的網路因使用 NetworkCallback
而傳回應用程式,包括選取裝置的預設網路 (當他們透過 ConnectivityManager.registerDefaultNetworkCallback
使用網路回呼時,系統傳送至應用程式的網路)。
不正確實作可能導致的另一個問題,是網路代理程式會以分數啟動,但分數不足以讓網路代理程式符合任何要求,並在之後立即拆除,導致嚴重耗電。如果服務專員不斷啟動和關閉,可能會耗用大量電力。