網絡選擇

本頁介紹 Android 如何在同時可用的網路之間進行選擇。這種網路選擇機制會影響Android如何滿足應用程式和系統網路請求,並影響如何選擇應用程式的預設網路。

網路選擇行為

本部分介紹運行 Android 12 或更高版本的裝置以及運行 Android 11 及更低版本的裝置的網路選擇行為。

安卓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中的標誌來傳達所需的網路資訊。

安卓11

對於運行 Android 11 或更低版本的設備,Android 根據從網路代理程式 ( NetworkAgent ) 的實作發送的簡單整數來執行網路選擇。對於每個請求,Android 都會選擇能夠滿足請求的得分最高的網路。此數字分數由網路代理程式發送的整數加上基於多種條件(例如網路是否經過驗證或網路是否為 VPN)給予的額外獎勵或懲罰組成。各個網路代理程式相互同步以做出策略決策。

如果兩個網路可以服務給定的請求並且具有相同的數字分數,則該行為是未定義的。

網路評分類

網路選擇功能的中心類別是NetworkScore 。此類別包含可用標誌和setKeepConnectedReason方法的 API 和文件。

NetworkScore類別必須透過其建構器類別構建,並在初始化時傳遞給NetworkAgent建構函數。可以使用NetworkAgent#sendNetworkScore方法隨時更新網路分數。

網路代理實作範例

AOSP 包括各種網路代理的範例實作。以下是範例實作:

升級到 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 裝置上的網路選擇行為,請使用下列測試:

不正確的實作可能會導致應用程式使用NetworkCallback時意外返回網絡,包括選擇設備的預設網絡(當應用程式使用ConnectivityManager.registerDefaultNetworkCallback的網路回調時系統發送到應用程式的網路)。

不正確實施的另一個可能的問題是,由於網路代理的分數不符合任何請求的資格,並在之後立即被拆除,從而導致嚴重的電池消耗。如果代理商被重複啟動和拆除,可能會消耗大量電池。