Zaman Kaynak Önceliği

Android çerçevesi, zaman senkronizasyonu için çeşitli zaman kaynaklarını kullanır. Bu sayfa Ağ Zaman Protokolü (NTP) ve Ağ Kimliği ve Zaman Dilimi (NITZ) otomatik zaman kaynaklarına odaklanmaktadır. Android 12 veya sonraki sürümlerde varsayılan olarak çerçeve, zaman kaynağı olarak NITZ'e göre NTP'ye öncelik verir çünkü NTP, NITZ'den daha doğru ve güvenilirdir. NTP'nin mevcut olmadığı durumlarda çerçeve NITZ'e dayanır. Bu, platformun önceki sürümlerindeki varsayılan önceliğin tersine çevrilmesidir. Android 11 ve önceki sürümlerde varsayılan olarak çerçeve, NTP yerine NITZ'ye öncelik verir.

Bu değişiklikle ilgili daha fazla ayrıntı için aşağıdaki AOSP yamalarına bakın: 1563678 , 1513323 .

Zaman kaynağı önceliğini yapılandırma

Belirli bir Android sürümü için varsayılan olarak hangi zaman kaynağının öncelikli olacağını yapılandırmak için, derleme zamanında frameworks/base/core/res/res/values/config.xml dosyasında config_autoTimeSourcesPriority anahtarını yapılandırın. Listede daha yüksek olan zaman kaynağından gelen zaman önerileri, listede daha düşük olan kaynaklara göre önceliklidir.

Yapılandırılabilen Android zaman kaynakları TimeDetectorStrategy.java bulunur. Aşağıdaki kaynaklar varsayılan olarak kullanılmak üzere yapılandırılmıştır:

  • Telefon (NITZ)
  • Ağ (NTP)

Test yapmak

NTP kullanılamadığında (mobil veriler ve Wi-Fi devre dışı bırakıldığında) cihazın NITZ kullandığını doğrulamak için aşağıdakileri yapın:

  1. DUT'ta çalışan bir SIM olduğundan emin olun
  2. Mobil verileri ve Wi-Fi'yi kapatın
  3. Hücresel radyonun kapalı olduğundan emin olmak için cihazı uçak moduna getirin
  4. Otomatik zaman algılamayı kapat
  5. Gelecekte saati manuel olarak yanlış bir zaman değerine ayarlayın
  6. Cihazı yeniden başlat
  7. Otomatik zaman algılamayı aç
  8. Cihazı uçak modundan çıkarın

Bu adımlar, bir NITZ sinyali alınır alınmaz sistem saatinde bir değişikliği tetikler. Cihaz saatinin nasıl ayarlandığını kontrol etmek için aşağıdaki komutu çalıştırın:

adb shell dumpsys time_detector

Sistem saatinin NITZ kullandığını doğrulamak için komut çıkışında aşağıdakileri onaylayın:

  • mEnvironment.isAutoTimeDetectionEnabled() true .
  • mEnvironment.autoOriginPriorities() listede daha üstteki kaynakların listede daha düşük kaynaklara göre öncelikli olduğu zaman kaynaklarının bir listesini içerir.
  • Time change log bölümü, sistem saatinin bir telefon önerisi kullanılarak ayarlandığını gösterir.
  • Telephony suggestion history bölümü zaman önerilerini içerir.
  • Network suggestion history bölümü boş.

Telephony suggestion history ve Network suggestion history bölümlerindeki zaman önerileri, zamana ilişkin doğruluk kaynağı olarak kabul edilir. Cihaz internete bağlıysa ve SIM kartı varsa öneriler hem NTP (ağ) hem de NITZ (telefon) kullanılarak oluşturulur. Bu test durumunda, NTP devre dışı olduğundan yalnızca Telephony suggestion history bölümü öneriler içerir.

Time change log bölümü, cihazın sistem saatinde yapılan değişiklikleri ve kullanılan öneriyi kaydeder. Sistem saati, config_autoTimeSourcesPriority anahtarındaki öncelik listesindeki zaman kaynaklarının sırasına göre ayarlanır. Ancak, öneri çok eski veya geçersizse, daha yüksek öncelikli bir kaynaktan gelen öneriler göz ardı edilebilir. Ayrıca, en yüksek öncelikli geçerli öneri cihazın mevcut sistem saatiyle birkaç saniye içinde eşleşirse saat değişmeyecektir. Bu test durumunda, öneriler güncel olmadığı sürece sistem saati, Telephony suggestion history önerilerden biri kullanılarak ayarlanır.

Aşağıda, NTP kullanılamadığında cihazın NITZ kullanmaya devam ettiği bir çıktı örneği verilmiştir.

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}

Test senaryosundaki çıktıyla karşılaştırma amacıyla referans olarak aşağıda cihazın hem NTP hem de NITZ zaman kaynaklarından zaman önerileri aldığı tipik bir çıktı örneği verilmiştir.

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}