Priorità della sorgente temporale

Il framework Android utilizza diverse origini orarie per la sincronizzazione dell'ora. Questa pagina si concentra sulle origini orarie automatiche Network Time Protocol (NTP) e Network Identity and Time Zone (NITZ). Per impostazione predefinita in Android 12 o versioni successive, il framework dà priorità a NTP come origine dell'ora rispetto a NITZ perché NTP è più preciso e affidabile di NITZ. Nelle situazioni in cui NTP non è disponibile, il framework ricorre a NITZ. Si tratta di un'inversione della priorità predefinita rispetto alle versioni precedenti della piattaforma. Per impostazione predefinita in Android 11 e versioni precedenti, il framework dà priorità a NITZ rispetto a NTP.

Per maggiori dettagli su questa modifica, vedere le seguenti patch AOSP: 1563678 , 1513323 .

Configurazione della priorità della sorgente temporale

Per configurare quale origine temporale ha la priorità per impostazione predefinita per una versione Android specifica, configurare la chiave config_autoTimeSourcesPriority in frameworks/base/core/res/res/values/config.xml in fase di compilazione. I suggerimenti orari provenienti dalla fonte temporale più in alto nell'elenco hanno la precedenza sulle fonti più in basso nell'elenco.

Le origini dell'ora Android che possono essere configurate si trovano in TimeDetectorStrategy.java . Le seguenti origini sono configurate per l'uso per impostazione predefinita:

  • Telefonia (NITZ)
  • Rete (NTP)

Test

Per verificare che il dispositivo utilizzi NITZ quando NTP non è disponibile (quando i dati mobili e Wi-Fi sono disabilitati), procedi come segue:

  1. Assicurati che ci sia una SIM funzionante nel DUT
  2. Disattiva i dati mobili e il Wi-Fi
  3. Metti il ​​dispositivo in modalità aereo per assicurarti che la radio cellulare sia spenta
  4. Disattiva il rilevamento automatico dell'ora
  5. Impostare manualmente l'orologio su un valore temporale errato per il futuro
  6. Riavviare il dispositivo
  7. Attiva il rilevamento automatico del tempo
  8. Togli il dispositivo dalla modalità aereo

Questi passaggi attivano una modifica all'orologio del sistema non appena viene ricevuto un segnale NITZ. Per verificare come è impostata l'ora del dispositivo, esegui il comando seguente:

adb shell dumpsys time_detector

Per verificare che l'orologio di sistema utilizzi NITZ, confermare quanto segue nell'output del comando:

  • mEnvironment.isAutoTimeDetectionEnabled() è true .
  • mEnvironment.autoOriginPriorities() contiene un elenco di fonti temporali con le fonti più in alto nell'elenco che hanno la precedenza sulle fonti più in basso nell'elenco.
  • La sezione Time change log mostra che l'orologio di sistema è impostato utilizzando un suggerimento di telefonia.
  • La sezione Telephony suggestion history contiene suggerimenti sull'orario.
  • La sezione Network suggestion history è vuota.

I suggerimenti orari nelle sezioni Telephony suggestion history e Network suggestion history sono considerati la fonte di verità per il tempo. Se il dispositivo è connesso a Internet e dispone di una scheda SIM, i suggerimenti vengono generati utilizzando sia NTP (rete) che NITZ (telefonia). In questo caso di test, solo la sezione Telephony suggestion history contiene suggerimenti perché NTP è disabilitato.

La sezione Time change log registra le modifiche apportate all'orologio di sistema del dispositivo e il suggerimento utilizzato. L'orologio di sistema viene impostato in base all'ordine delle origini orarie nell'elenco di priorità nella chiave config_autoTimeSourcesPriority . Tuttavia, i suggerimenti provenienti da una fonte con priorità più elevata potrebbero essere ignorati se il suggerimento è troppo vecchio o non valido. Inoltre, se il suggerimento valido con la priorità più alta corrisponde all'ora corrente dell'orologio di sistema del dispositivo entro un paio di secondi, l'ora non verrà modificata. In questo caso di test, purché i suggerimenti non siano obsoleti, l'orologio di sistema viene impostato utilizzando uno dei suggerimenti della Telephony suggestion history .

Di seguito è riportato un esempio di un output in cui il dispositivo ricorre all'utilizzo di NITZ quando NTP non è disponibile.

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}

Per riferimento come confronto con l'output nello scenario di test, quello che segue è un esempio di un output tipico in cui il dispositivo riceve suggerimenti orari da entrambe le sorgenti orarie NTP e 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}