네트워크 시간 감지

Android 기기는 자동으로 네트워크 소스에서 올바른 유닉스 시간을 가져오려고 합니다. Android는 UDP 프로토콜을 사용하는 SNTP 프로토콜을 사용하여 시간 정보를 가져옵니다.

이 페이지에 설명된 구성요소는 네트워크 시간 출처라고 하는 자동 시간 감지 시스템의 일부입니다. 네트워크 시간 서버의 시간 신호는 기기에서 자동 시간 감지가 지원되고 time_detector 서비스가 이를 사용하도록 구성된 경우 Android 기기의 시스템 시계를 설정하는 데 사용할 수 있습니다.

기본적으로 Android는 네트워크 시간 출처를 기본 자동 시간 감지 출처로 사용합니다.

네트워크 시간 감지 시스템

Android 시스템 서버에서 실행되는 network_time_update_service 서비스는 네트워크 시간 감지 시스템을 구현합니다. 서비스는 주기적으로 SNTP를 사용하여 서버에서 시간 신호를 가져옵니다. 또한 서비스는 네트워크 연결을 모니터링하고, 장시간 불안정한 연결 상태 후 사용할 수 있는 최근 시간 신호가 없을 때 시간 새로고침을 트리거합니다.

network_time_update_service 서비스는 부팅 후와 네트워크 연결이 처음 설정될 때 시간 신호를 가져오려고 합니다. 그런 다음 서비스는 보유한 최신 신호를 최신 상태로 유지하려고 합니다. 개별 Android 기기의 요구사항과 시간을 새로고침하는 전 세계의 많은 Android 기기에서 생성될 수 있는 상당한 부하의 균형을 유지합니다.

내부 API를 사용하여 network_time_update_servicetime_detector 서비스에 네트워크 시간 추천을 제출합니다. 그러면 다른 Android 플랫폼 구성요소에서 이러한 네트워크 시간 추천을 사용합니다.

네트워크 시간 출처의 추천을 수신한 후 time_detector 서비스는 구성된 우선순위 지정 규칙에 따라 시스템 시계를 업데이트할지 결정합니다.

네트워크 출처 추천을 사용하여 시스템 시계를 자동으로 설정하도록 자동 시간 감지 시스템을 구성하려면 core/res/res/values/config.xml 시스템 서버 구성 파일을 사용하세요. 값 networkconfig_autoTimeSourcesPriority의 원하는 위치에 포함되어 있는지 확인합니다. 자세한 내용은 시간 소스 우선순위를 참고하세요.

기기 구성

이 섹션에서는 기기 제조업체가 네트워크 시간 감지 시스템을 구성하는 방법을 설명합니다.

기본 AOSP 구성은 frameworks/base/core/res/res/values/config.xml에 있습니다.

구성 키 AOSP 값 설명
config_ntpRetry 3 새로고침에 실패한 후 시스템이 백오프하여 일반 폴링 간격(config_ntpPollingInterval)을 사용하기 전에 더 짧은 NTP 폴링 간격(config_ntpPollingIntervalShorter)으로 네트워크 시간 폴링을 시도하는 횟수입니다. 0보다 작은 값은 시스템이 성공적으로 새로고침을 할 수 있을 때까지 더 짧은 NTP 폴링 간격으로 폴링을 재시도한다는 의미입니다.
config_ntpPollingInterval 64800000(18시간) 일반 네트워크 시간 폴링 간격(밀리초)입니다.
config_ntpPollingIntervalShorter 60000(1분) 재시도 네트워크 시간 폴링 간격(밀리초)입니다. 시간 새로고침에 실패할 때 사용됩니다.
config_ntpServers 단일 항목: ntp://time.android.com 정확한 시간을 가져오는 데 사용하는 NTP 서버입니다. 항목은 다음 형식이어야 합니다. ntp://<host>[:port]
등록된 IANA URI 스킴이 아닙니다.
config_ntpTimeout 5000 제한 시간 전에 NTP 서버 응답을 기다리는 시간(밀리초)입니다.

서버

기본적으로 AOSP는 Google 공개 NTP의 별칭인 time.android.com의 시간 서버를 사용합니다. 이 서비스에는 SLA가 없습니다. 자세한 내용은 Google 공개 NTP FAQ를 참고하세요.

다중 서버 지원

Android 14 이상의 경우 프레임워크는 다중 NTP 서버를 지원합니다. 이는 기기가 단일 구성으로 전 세계에 배포되지만 time.android.com과 같은 서버 액세스가 특정 장소에서 제한되는 상황을 지원합니다.

알고리즘은 config_ntpServers 구성 키에서 지정된 각 서버를 시도합니다. 응답하는 서버를 찾으면 시스템은 새로고침에 실패하거나 기기가 재부팅할 때까지 해당 서버를 계속 사용합니다.

 정확성

Android의 기본 네트워크 시간 동기화는 대략 하루에 한 번 단일 시간 쿼리와 함께 SNTP를 사용하여 항상 최근 시간 신호를 갖는지 확인하려고 합니다.

네트워크 지연 시간 효과는 Android의 SNTP 구현에서 시간 부정확성의 가장 큰 원인입니다. SNTP는 대칭 네트워크 지연을 가정합니다. 즉, 요청의 네트워크 지연 시간이 응답의 네트워크 지연 시간과 동일하며 정확한 시간은 해당 네트워크 왕복의 한가운데에 있습니다. 종종 네트워크 왕복 시간은 몇백 밀리초이며 유선 네트워크에서 지연 시간은 대칭에 가까워 부정확성이 사용자가 거의 인지할 수 없는 수준이 됩니다. 그러나 모바일 또는 무선 전화 통신에는 비교적 길고 비대칭적인 지연이 네트워크 트랜잭션에 삽입되어 부정확성이 훨씬 커질 수 있는 여러 단계가 있습니다.

config_ntpTimeout의 AOSP 기본 설정이 5000밀리초로 설정되고, 모든 네트워크 지연 시간이 인바운드 또는 아웃바운드 레그에만 집중되는 경우 최대 이론 오류는 대략 2.5초입니다.

전체 시스템 시계 정확성은 시간 신호를 가져온 후 경과된 시간을 정확하게 추적하는 Android 기기의 기능에도 영향을 받습니다. 이는 네트워크 시간 감지뿐 아니라 Android의 모든 시간 기록과 관련된 문제이며 time_detector 서비스가 이전 시간 추천을 무시하는 이유입니다. network_time_update_service 서비스는 config_ntpPollingInterval 간격을 통해 정기적으로 새로고침하여 time_detector 서비스에 최신 시간 추천이 계속 제공되도록 하며 time_detector 서비스가 telephony와 같은 우선순위가 낮고 종종 정확성이 낮거나 때때로 부정확한 시간 출처로 대체되지 않도록 합니다.

자동 시간 감지가 사용될 때 기기 시스템 시계 정확성은 시계가 조정되기 전에 시간 추천이 현재 시스템 시계 시간과 달라야 하는 정도에 영향을 미치는 상수 및 플래그와 같은 time_detector 서비스의 다른 구성에 의해 영향을 받을 수 있습니다(ServiceConfigAccessorImpl.java).

기기 제조업체는 이전 구성 옵션과 상수를 사용하여 정확성을 수정할 수 있습니다. 그러나 플랫폼의 SNTP 구현에 관한 제한사항과 더 빈번한 네트워크 작업의 전력 소비에 미치는 잠재적 영향, 더 빈번하지만 적은 시계 조정으로 인해 기기에서 실행되는 앱에 미치는 영향, 서버 로드에 미치는 영향을 알고 있어야 합니다.

네트워크 시간의 다른 용도

network 출처를 사용하는 자동 시간 감지가 구성되지 않은 경우 또는 사용자가 자동 시간 감지를 사용 중지한 경우 network_time_update_service 서비스가 가져온 시간이 여전히 다음 구성요소에서 사용됩니다.

  • SystemClock.currentNetworkTimeClock() 메서드
  • 내부 플랫폼 기능. 예를 들어 A-GPS는 네트워크 시간 정보가 있을 때 GNSS(위치) 최초 고정을 더 빨리 찾을 수 있습니다.

디버깅 및 테스트

다음 섹션에서는 네트워크 시간 감지 기능을 디버깅하고 테스트하는 데 사용하는 셸 명령어를 설명합니다.

network_time_update_service 서비스와 상호작용

network_time_update_service의 현재 상태를 덤프하려면 다음을 사용합니다.

adb shell cmd network_time_update_service dump

테스트에 도움을 줄 수 있는 일련의 명령줄 옵션을 확인하려면 다음을 사용하세요.

adb shell cmd network_time_update_service help