네트워크 선택

이 페이지에서는 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에는 다양한 네트워크 에이전트의 구현 예가 포함되어 있습니다. 다음은 구현의 예입니다.

  • 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 클래스가 Android 11 이하의 모든 요청이 아닌 NetworkFactory로 선언된 점수 필터와 일치하는 요청만 전달하기 때문입니다.

모든 요청이 NetworkFactory에 전달되지는 않도록 더 간편한 구현과 배터리 절약을 위해 필터를 전달하는 것이 좋습니다. 그러나 맞춤 구현에서 모든 요청을 NetworkFactory에 전달해야 하는 경우 일반적인 NetworkFactory.register 메서드 대신 NetworkFactory.registerIgnoringScore를 등록할 수 있습니다. 이 메서드를 사용하는 경우 팩토리에서 처리할 수 없는 요청을 평가하지 않음으로써 배터리를 절약하기 위해 팩토리에서 만들 수 있는 최고 점수를 가장 정확히 나타내는 점수 필터를 전달하는 것이 좋습니다.

유효성 검사

Android 기기에서 네트워크 선택 동작을 확인하려면 다음 테스트를 사용합니다.

잘못 구현하면 NetworkCallback 사용의 응답으로 예기치 않은 네트워크가 앱에 반환될 수도 있습니다. 여기에는 기기의 기본 네트워크 선택이 포함됩니다(ConnectivityManager.registerDefaultNetworkCallback과 함께 네트워크 콜백을 사용할 때 시스템이 앱에 전송하는 네트워크).

잘못된 구현으로 인해 발생할 수 있는 또 다른 문제는 어떠한 요청에도 적합하지 않은 점수로 네트워크 에이전트를 불러온 후에 즉시 해제하는 과정으로 인해 발생하는 심각한 배터리 소모입니다. 반복적으로 에이전트를 불러오고 해제하면 배터리가 많이 소모될 수 있습니다.