本頁說明 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
。
這個類別包含 API、可用旗標和說明文件
setKeepConnectedReason
方法。
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
)。
另一個可能的實作錯誤是嚴重耗電 因為網路代理程式的上升分數 符合任何請求資格,且在事後立即卸除。如果服務專員: 反覆出現,這會消耗大量電力。