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를 사용하는지 확인하려면 다음을 수행하십시오.
- DUT에 작동하는 SIM이 있는지 확인
- 모바일 데이터 및 Wi-Fi 끄기
- 장치를 비행기 모드로 전환하여 셀 라디오가 꺼져 있는지 확인하십시오.
- 자동 시간 감지 끄기
- 미래의 잘못된 시간 값으로 시계를 수동으로 설정
- 기기 재부팅
- 자동 시간 감지 켜기
- 비행기 모드에서 장치 꺼내기
이러한 단계는 NITZ 신호가 수신되는 즉시 시스템 클록에 대한 변경을 트리거합니다. 장치 시간이 어떻게 설정되어 있는지 확인하려면 다음 명령을 실행하십시오.
adb shell dumpsys time_detector
시스템 시계가 NITZ를 사용하는지 확인하려면 명령 출력에서 다음을 확인하십시오.
-
mEnvironment.isAutoTimeDetectionEnabled()
는true
입니다. -
mEnvironment.autoOriginPriorities()
는 목록에서 더 높은 소스가 목록에서 더 낮은 소스보다 우선하는 시간 소스 목록을 포함합니다. -
Time change log
섹션은 시스템 시계가 전화 제안을 사용하여 설정되었음을 보여줍니다. -
Telephony suggestion history
섹션에는 시간 제안이 포함되어 있습니다. -
Network suggestion history
섹션이 비어 있습니다.
Telephony suggestion history
및 Network 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}