이 페이지에서는 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
클래스를 사용하면 네트워크 에이전트가 KEEP_CONNECTED_FOR_HANDOVER
플래그 및 NetworkScore.Builder.setKeepConnectedReason
메서드를 사용하여 Android에서 네트워크를 연결된 상태로 유지하도록 선언할 수 있습니다. 이 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
과 함께 네트워크 콜백을 사용할 때 시스템이 앱에 전송하는 네트워크).
잘못된 구현으로 인해 발생할 수 있는 또 다른 문제는 심각한 배터리 소모입니다. 이는 어떠한 요청에도 적합하지 않은 점수로 네트워크 에이전트를 불러온 후에 즉시 해제하는 과정으로 인해 발생합니다. 에이전트가 반복적으로 불러오고 해제되면 배터리가 많이 소모될 수 있습니다.