네트워크 선택

이 페이지에서는 Android가 동시에 사용 가능한 네트워크 중에서 선택하는 방법을 설명합니다. 이 네트워크 선택 메커니즘은 Android가 앱 및 시스템 네트워크 요청을 처리하는 방식과 Android가 앱의 기본 네트워크를 선택하는 방식에 영향을 줍니다.

네트워크 선택 동작

이 섹션에서는 Android 12 이상을 실행하는 기기와 Android 11 (API 수준 30) 이하를 실행하는 기기의 네트워크 선택 동작을 설명합니다.

Android 12

Android 12 이상을 실행하는 기기의 경우 Android는 NetworkScore 클래스를 사용하여 사용 가능한 네트워크 중에서 선택합니다. 이 클래스에는 정책 결정을 내리는 플래그가 포함되어 있습니다. 각 플래그는 네트워크 선택에 중요한 네트워크 속성을 나타냅니다.

네트워크 에이전트 (NetworkAgent)는 POLICY_TRANSPORT_PRIMARY 플래그를 사용하여 동일한 전송의 여러 네트워크가 존재할 때 Android가 특정 네트워크를 선호한다는 것을 지정합니다. 예를 들어 듀얼 SIM 기기에는 설정 에 사용자가 기본적으로 사용할 SIM 카드를 선택할 수 있는 스위치가 있습니다. 지정된 전송 내에서 Android는 플래그가 없는 네트워크보다 POLICY_TRANSPORT_PRIMARY 플래그가 있는 네트워크를 선호합니다.

네트워크 에이전트는 POLICY_EXITING 플래그를 사용하여 연결 해제될 것으로 예상되는 네트워크를 식별합니다. 예를 들어 사용자가 네트워크 범위를 벗어나면 Wi-Fi 네트워크 품질이 저하됩니다. Android는 이 플래그가 없는 다른 네트워크를 사용할 수 있는 경우 이 플래그가 있는 네트워크를 사용하지 않습니다. 각 네트워크 에이전트는 네트워크가 종료되는 것으로 간주될 만큼 성능이 저하되는 시점을 파악할 수 있습니다.

NetworkScore 클래스를 사용하면 네트워크 에이전트가 Android가 네트워크 연결을 유지하도록 KEEP_CONNECTED_FOR_HANDOVER 플래그 및 NetworkScore.Builder.setKeepConnectedReason 메서드를 사용하여 선언할 수도 있습니다. 이 KEEP_CONNECTED_FOR_HANDOVER 플래그는 잠재적 네트워크에 도움이 됩니다. 이 플래그를 사용하면 네트워크 에이전트가 Android에서 네트워크 성능을 평가할 때까지 보조 Wi-Fi STA에서 네트워크를 불러올 수 있고 이때 이 네트워크를 기본 네트워크로 전환하지 않아도 됩니다. 네트워크 에이전트가 이 플래그를 선언하지 않으면 에이전트가 네트워크 성능을 평가하기 전에는 요청을 처리하지 않으므로 Android가 잠재적 네트워크를 해제합니다.

두 네트워크가 지정된 요청을 처리할 수 있고 정책이 동등하면 Android는 요청을 처리 중인 네트워크를 선호합니다. 요청을 처리하는 네트워크가 없는 경우 Android는 두 가지 중 하나를 선택합니다. 이 네트워크는 정책 플래그가 변경될 때까지 계속 우선적으로 사용됩니다.

네트워크 선택 기능은 연결 모듈에서 Android 오픈소스 프로젝트 (AOSP)에 구현됩니다. 네트워크 선택을 위한 정책 로직은 NetworkRanker 클래스 및 도우미 클래스에 있습니다. 즉, 기기 제조업체는 네트워크 선택 코드를 직접 맞춤설정할 수 없습니다. 대신 NetworkScore의 플래그를 사용하여 네트워크에 관한 정보를 전달해야 합니다.

Android 11

Android 11 이하를 실행하는 기기의 경우 Android는 네트워크 에이전트 (NetworkAgent)에서 전송된 정수를 기반으로 네트워크 선택을 실행합니다. 각 요청에 관해 Android는 요청을 충족할 수 있는 가장 높은 숫자 점수를 가진 네트워크를 선택합니다. 이 숫자 점수는 네트워크 에이전트가 전송한 정수와 추가 보너스 또는 페널티로 구성됩니다. Android는 네트워크가 검증되었는지 또는 VPN인지와 같은 조건을 기반으로 이러한 보너스 또는 페널티를 적용합니다. 네트워크 에이전트는 정책 결정을 내리기 위해 서로 동기화됩니다.

두 네트워크가 지정된 요청을 처리할 수 있고 동일한 숫자 점수를 가지는 경우 동작은 정의되지 않습니다.

NetworkScore 클래스

NetworkScore 클래스는 네트워크 선택 기능의 중심입니다. 이 클래스에는 사용 가능한 플래그 및 NetworkScore.Builder.setKeepConnectedReason 메서드의 API와 문서가 포함되어 있습니다.

빌더 클래스를 사용하여 NetworkScore 클래스를 빌드하고 초기화 중에 NetworkAgent 생성자에 전달해야 합니다. NetworkAgent#sendNetworkScore 메서드를 사용하여 언제든지 네트워크 점수를 업데이트할 수 있습니다.

네트워크 에이전트 구현 예

AOSP에는 다양한 네트워크 에이전트의 구현 예가 포함되어 있습니다. 다음 목록은 구현 예를 제공합니다.

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

필터를 전달하여 구현을 간소화하고 배터리를 절약할 수 있습니다. 이렇게 하면 NetworkFactory가 모든 요청을 처리하지 않습니다. 하지만 맞춤 구현에서 모든 요청을 NetworkFactory에 전달해야 하는 경우 일반 NetworkFactory.register 메서드 대신 NetworkFactory.registerIgnoringScore을 등록할 수 있습니다. 이 메서드를 사용하는 경우 팩토리에서 만들 수 있는 최고 점수를 가장 정확히 나타내는 점수 필터를 전달합니다. 이렇게 하면 팩토리에서 처리할 수 없는 요청을 평가하지 않음으로써 배터리를 절약할 수 있습니다.

유효성 검사

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

  • NetworkScoreTest CTS 테스트
  • NetworkRanker 단위 테스트

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

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