網絡選擇

本頁面介紹了 Android 如何在並發可用網絡之間進行選擇。這種網絡選擇機制會影響 Android 滿足應用和系統網絡請求的方式,並影響應用默認網絡的選擇方式。

網絡選擇行為

本部分介紹運行 Android 12 或更高版本的設備以及運行 Android 11 及更低版本的設備的網絡選擇行為。

安卓 12

對於運行Android 12或更高版本的設備,機器人使用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或更低,機器人執行網絡選擇的設備NetworkAgent )。對於每個請求,Android 會選擇可以滿足請求的得分最高的網絡。該數字分數由網絡代理髮送的整數加上基於許多條件(例如網絡是否經過驗證或網絡是否為 VPN)給出的額外獎勵或處罰組成。各個網絡代理彼此同步以做出策略決策。

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

NetworkScore 類

為網絡選擇功能的核心類是NetworkScore 。這個類包含了API和可用標誌的文檔和setKeepConnectedReason方法。

NetworkScore類必須通過它的建造一流建成並傳遞給NetworkAgent構造函數初始化時。網絡分數可以在使用的任何時間更新NetworkAgent#sendNetworkScore方法。

網絡代理實現示例

AOSP 包括各種網絡代理的示例實現。以下是示例實現:

  • DcNetworkAgent :使用網絡比分通信移動網絡政策
  • 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 )。

不正確實施的另一個可能問題是嚴重的電池消耗是由於網絡代理被調出的分數不符合任何請求並在之後立即被拆除。如果代理被反复啟動和拆除,這可能會消耗大量電池。