시간 소스 우선 순위

Android 프레임워크는 시간 동기화를 위해 다양한 시간 소스를 사용합니다. 이 페이지는 NTP(Network Time Protocol) 및 NITZ(Network Identity and Time Zone) 자동 시간 소스에 중점을 둡니다. 기본적으로 Android 12 이상에서는 NTP가 NITZ보다 정확하고 안정적이기 때문에 프레임워크는 NITZ보다 NTP를 시간 소스로 우선시합니다. NTP를 사용할 수 없는 상황에서 프레임워크는 NITZ로 대체됩니다. 이것은 플랫폼의 이전 버전에서 기본 우선 순위를 뒤집은 것입니다. 기본적으로 Android 11 이하에서는 프레임워크가 NTP보다 NITZ를 우선시합니다.

이 변경 사항에 대한 자세한 내용은 다음 AOSP 패치를 참조하세요. 1563678 , 1513323 .

시간 소스 우선 순위 구성

특정 Android 버전에 대해 기본적으로 우선 순위가 높은 시간 소스를 구성하려면 빌드 시 frameworks/base/core/res/res/values/config.xml 에서 config_autoTimeSourcesPriority 키를 구성하십시오. 목록에서 더 높은 시간 소스의 시간 제안이 목록에서 더 낮은 소스보다 우선합니다.

구성할 수 있는 Android 시간 소스는 TimeDetectorStrategy.java 에서 찾을 수 있습니다. 다음 소스는 기본적으로 사용하도록 구성됩니다.

  • 전화(NITZ)
  • 네트워크(NTP)

테스트

NTP를 사용할 수 없을 때(모바일 데이터 및 Wi-Fi가 비활성화된 경우) 장치가 NITZ를 사용하는지 확인하려면 다음을 수행하십시오.

  1. DUT에 작동하는 SIM이 있는지 확인
  2. 모바일 데이터 및 Wi-Fi 끄기
  3. 장치를 비행기 모드로 전환하여 셀 라디오가 꺼져 있는지 확인하십시오.
  4. 자동 시간 감지 끄기
  5. 미래의 잘못된 시간 값으로 시계를 수동으로 설정
  6. 기기 재부팅
  7. 자동 시간 감지 켜기
  8. 비행기 모드에서 장치 꺼내기

이러한 단계는 NITZ 신호가 수신되는 즉시 시스템 클록에 대한 변경을 트리거합니다. 장치 시간이 어떻게 설정되어 있는지 확인하려면 다음 명령을 실행하십시오.

adb shell dumpsys time_detector

시스템 시계가 NITZ를 사용하는지 확인하려면 명령 출력에서 ​​다음을 확인하십시오.

  • mEnvironment.isAutoTimeDetectionEnabled()true 입니다.
  • mEnvironment.autoOriginPriorities() 는 목록에서 더 높은 소스가 목록에서 더 낮은 소스보다 우선하는 시간 소스 목록을 포함합니다.
  • Time change log 섹션은 시스템 시계가 전화 제안을 사용하여 설정되었음을 보여줍니다.
  • Telephony suggestion history 섹션에는 시간 제안이 포함되어 있습니다.
  • Network suggestion history 섹션이 비어 있습니다.

Telephony suggestion historyNetwork suggestion history 섹션의 시간 제안은 시간에 대한 진실의 근원으로 간주됩니다. 장치가 인터넷에 연결되어 있고 SIM 카드가 있는 경우 NTP(네트워크) 및 NITZ(전화)를 사용하여 제안이 생성됩니다. 이 테스트 사례에서는 NTP가 비활성화되어 있으므로 Telephony suggestion history 섹션에만 제안이 포함됩니다.

Time change log 섹션에는 장치의 시스템 시계에 대한 변경 사항과 사용된 제안 사항이 기록됩니다. 시스템 시계는 config_autoTimeSourcesPriority 키의 우선 순위 목록에 있는 시간 소스의 순서에 따라 설정됩니다. 그러나 제안이 너무 오래되었거나 유효하지 않은 경우 더 높은 우선순위 소스의 제안이 무시될 수 있습니다. 또한 가장 높은 우선 순위의 유효한 제안이 장치의 현재 시스템 시계 시간과 몇 초 이내로 일치하는 경우 시간이 변경되지 않습니다. 이 테스트 사례에서 제안이 오래되지 않은 한 시스템 시계는 Telephony suggestion history 의 제안 중 하나를 사용하여 설정됩니다.

다음은 NTP를 사용할 수 없을 때 장치가 NITZ를 사용하여 폴백하는 출력의 예입니다.

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=73059
  mEnvironment.systemClockMillis()=1614186767818
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    {Empty}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}

테스트 시나리오의 출력과 비교하기 위해 다음은 장치가 NTP 및 NITZ 시간 소스 모두에서 시간 제안을 수신하는 일반적인 출력의 예입니다.

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=302926
  mEnvironment.systemClockMillis()=1614186997685
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    0@PT4M4.04S: NetworkTimeSuggestion{mUtcTime=TimestampedValue{mReferenceTimeMillis=244038, mValue=1614186939242}, mDebugInfo=[Origin: NetworkTimeUpdateService. event=3]}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}