네트워크 선택

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

  • 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 기기에서 네트워크 선택 동작을 확인하려면 다음 테스트를 사용하세요.

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

잘못된 구현으로 인해 발생할 수 있는 또 다른 문제는 네트워크 에이전트가 요청에 적합하지 않은 점수를 표시한 후 즉시 중단되어 발생하는 심각한 배터리 소모입니다. 에이전트가 반복적으로 실행 및 종료되면 배터리를 많이 소모할 수 있습니다.