Priorità dell'origine temporale

Il framework Android utilizza diverse origini dell'ora per la sincronizzazione dell'ora. Questa pagina è incentrata sul protocollo NTP (Network Time Protocol) e Origini ora automatiche dell'identità di rete e del fuso orario (NITZ). Per impostazione predefinita, in Android 12 o versioni successive, il framework assegna la priorità alla NTP come sorgente di tempo rispetto a NITZ perché NTP è più precisa e affidabile di NITZ. Nei casi in cui NTP non è disponibile, il framework utilizza NITZ. Si tratta di un'inversione della priorità predefinita rispetto alle versioni precedenti completamente gestita. Per impostazione predefinita, in Android 11 e versioni precedenti, il framework dà la priorità a NITZ su NTP.

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

Configura la priorità dell'origine ora

Per configurare l'origine ora che ha la priorità per impostazione predefinita per un dispositivo Android specifico configura la versione config_autoTimeSourcesPriority chiave in frameworks/base/core/res/res/values/config.xml al momento della creazione. Data/ora i suggerimenti dell'origine dell'ora che si trova più in alto nell'elenco hanno la precedenza rispetto a quelle più in basso nell'elenco.

Le origini orario Android configurabili si trovano in TimeDetectorStrategy.java Le seguenti origini sono configurate per l'utilizzo per impostazione predefinita:

  • Telefonia (NITZ)
  • Rete (NTP)

Test

Per verificare che il dispositivo utilizzi NITZ quando NTP non è disponibile (quando i dati mobili e il Wi-Fi sono disattivati), procedi nel seguente modo:

  1. Assicurati che nel corso sia presente una SIM funzionante
  2. Disattivare i dati mobili e il Wi-Fi
  3. Attiva la modalità aereo sul dispositivo per assicurarti che il segnale radio cellulare sia disattivato
  4. Disattivare il rilevamento automatico del tempo
  5. Imposta manualmente l'orologio su un valore di ora errato nel futuro
  6. Riavviare il dispositivo
  7. Attivare il rilevamento automatico del tempo
  8. Disattiva la modalità aereo del dispositivo

Questi passaggi attivano una modifica dell'orologio di sistema non appena un NITZ il segnale è ricevuto. Per controllare come è impostata l'ora del dispositivo, esegui questo comando: :

adb shell dumpsys time_detector

Per verificare che l'orologio di sistema utilizzi NITZ, conferma quanto segue nel comando :

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

I suggerimenti di orario in Telephony suggestion history e Le sezioni Network suggestion history sono considerate la fonte attendibile per nel tempo. Se il dispositivo è connesso a internet e ha una scheda SIM, ricevi suggerimenti vengono generati utilizzando sia NTP (rete) che NITZ (telefonia). In questo scenario di test, solo la sezione Telephony suggestion history contiene suggerimenti perché NTP disattivata.

La sezione Time change log registra le modifiche apportate al l'orologio di sistema e il suggerimento utilizzato. L'orologio di sistema viene impostato in base delle origini temporali nell'elenco di priorità in la chiave config_autoTimeSourcesPriority. Tuttavia, i suggerimenti di un un'origine con priorità più elevata potrebbe essere ignorata se il suggerimento è troppo vecchio o non valido. Inoltre, se il suggerimento valido con la massima priorità corrisponde all'attuale suggerimento nell'orologio di sistema entro un paio di secondi l'ora non verrà modificata. In questo caso di test, se i suggerimenti non sono obsoleti, l'orologio di sistema viene impostato utilizzando uno dei suggerimenti di Telephony suggestion history.

Di seguito è riportato un esempio di output in cui il dispositivo utilizza il 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}

Come riferimento per un confronto con l'output nello scenario di test, Di seguito è riportato un esempio di un tipico output in cui il dispositivo riceve suggerimenti di orario da fonti temporali sia NTP che 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}