Zaman kaynağı önceliği

Android yapısı, zaman senkronizasyonu için çeşitli zaman kaynakları kullanır. Bu sayfa, Ağ Saat Protokolü (NTP) ile Ağ Kimliği ve Saat Dilimi (NITZ) otomatik saat kaynaklarına odaklanmaktadır. Android 12 veya sonraki sürümlerde çerçeve, varsayılan olarak NITZ'den daha doğru ve güvenilir olduğu için zaman kaynağı olarak NTP'ye öncelik verir. NTP'nin kullanılamadığı durumlarda çerçeve NITZ'e geçer. Bu, platformun önceki sürümlerindeki varsayılan önceliğin tersine çevrilmesidir. Android 11 ve önceki sürümlerde çerçeve varsayılan olarak NTP yerine NITZ'ye öncelik verir.

Bu değişiklik hakkında daha fazla bilgi için aşağıdaki AOSP yamalarını inceleyin: 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 üzere, derleme sırasında frameworks/base/core/res/res/values/config.xml'da config_autoTimeSourcesPriority anahtarını yapılandırın. Listede daha yukarıda yer alan zaman kaynağından gelen zaman önerileri, listede daha aşağıda yer alan kaynaklara göre önceliklidir.

Yapılandırılabilir Android saat kaynakları TimeDetectorStrategy.java bölümünde bulunur. Aşağıdaki kaynaklar varsayılan olarak kullanıma yönelik şekilde yapılandırılmıştır:

  • Telefon (NITZ)
  • Ağ (NTP)

Test

NTP kullanılamadığında (mobil veri ve kablosuz ağ devre dışıyken) cihazın NITZ'yi kullandığını doğrulamak için aşağıdakileri yapın:

  1. DUT içinde çalışan bir SIM olduğundan emin olun
  2. Mobil veri ve kablosuz bağlantıyı kapat
  3. Hücresel radyonun kapalı olduğundan emin olmak için cihazı uçak moduna geçirin
  4. Otomatik saat algılamayı devre dışı bırakma
  5. Saati manuel olarak gelecekte yanlış bir zaman değerine ayarlayın
  6. Cihazı yeniden başlatma
  7. Otomatik saat algılamayı etkinleştirme
  8. Cihazı uçak modundan çıkarın

Bu adımlar, NITZ sinyali alınır alınmaz sistem saatinde bir değişiklik 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 çıktısında aşağıdakileri onaylayın:

  • mEnvironment.isAutoTimeDetectionEnabled() true.
  • mEnvironment.autoOriginPriorities(), listede daha yukarıda yer alan kaynakların listede daha aşağıda yer alan kaynaklara göre öncelikli olduğu bir zaman kaynağı listesi içerir.
  • Time change log bölümünde, sistem saatinin bir telefon önerisi kullanılarak ayarlandığı gösterilir.
  • Telephony suggestion history bölümünde zaman önerileri yer alır.
  • Network suggestion history bölümü boş.

Telephony suggestion history ve Network suggestion history bölümlerindeki zaman önerileri, zamanın doğru kaynağı olarak kabul edilir. Cihaz internete bağlıysa ve SIM kartı varsa hem NTP (ağ) hem de NITZ (telefon) kullanılarak öneriler oluşturulur. Bu test durumunda, NTP devre dışı bırakıldığı için yalnızca Telephony suggestion history bölümünde öneriler bulunur.

Time change log bölümünde, cihazın sistem saatinde yapılan değişiklikler ve kullanılan öneri kaydedilir. Sistem saati, config_autoTimeSourcesPriority anahtarındaki öncelik listesinde zaman kaynaklarının sırasına göre ayarlanır. Ancak daha yüksek öncelikli bir kaynaktan gelen öneriler çok eski veya geçersizse yoksayılabilir. Ayrıca, en yüksek öncelikli geçerli öneri, cihazın mevcut sistem saatiyle birkaç saniye içinde eşleşirse saat değiştirilmez. Bu test durumunda, öneriler güncel olduğu sürece sistem saati Telephony suggestion history'teki önerilerden biri kullanılarak ayarlanır.

Aşağıda, NTP kullanılamadığında cihazın NITZ'i kullanmaya geçtiği bir çıkış ö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 olarak referans olması için aşağıda cihazın hem NTP hem de NITZ zaman kaynaklarından zaman önerileri aldığı tipik bir çıkış ö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}