Priorità dell'origine temporale

Il framework Android utilizza varie origini dell'ora per la sincronizzazione dell'ora. Questa pagina è incentrata 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à la priorità a NTP come origine di tempo rispetto a NITZ perché NTP è più preciso e affidabile di NITZ. Se NTP non è disponibile, il framework utilizza NITZ. Si tratta di un'inversione della priorità predefinita delle versioni precedenti della piattaforma. Per impostazione predefinita, in Android 11 e versioni precedenti, il framework dà la priorità a NITZ rispetto a NTP.

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

Configurare la priorità dell'origine di tempo

Per configurare l'origine di tempo che ha la priorità per impostazione predefinita per una versione Android specifica, configura la chiave config_autoTimeSourcesPriority in frameworks/base/core/res/res/values/config.xml in fase di compilazione. I suggerimenti relativi all'ora provenienti dall'origine ora più in alto nell'elenco hanno la precedenza su quelli delle origini più in basso nell'elenco.

Le origini orarie di Android che possono essere configurate si trovano in TimeDetectorStrategy.java. Per impostazione predefinita, le seguenti origini sono configurate per l'utilizzo:

  • 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 DUT sia presente una SIM funzionante
  2. Disattivare i dati mobili e il Wi-Fi
  3. Metti il dispositivo in modalità aereo per assicurarti che il segnale radio cellulare sia disattivato
  4. Disattivare il rilevamento automatico dell'ora
  5. Imposta manualmente l'orologio su un valore di ora errato nel futuro
  6. Riavvia il dispositivo
  7. Attivare il rilevamento automatico dell'ora
  8. Disattiva la modalità aereo del dispositivo

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

adb shell dumpsys time_detector

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

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

I suggerimenti relativi all'ora nelle sezioni Telephony suggestion history e Network suggestion history sono considerati la fonte attendibile per l'ora. Se il dispositivo è connesso a internet e ha una scheda SIM, i suggerimenti vengono generati utilizzando sia NTP (rete) sia NITZ (telefonia). In questo caso di test, solo la sezione Telephony suggestion history contiene suggerimenti perché l'NTP è disattivato.

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 temporali nell'elenco di priorità nel tasto config_autoTimeSourcesPriority. Tuttavia, i suggerimenti di una fonte con priorità più elevata potrebbero essere ignorati se sono troppo vecchi o non validi. Inoltre, se il suggerimento valido con priorità più alta corrisponde all'ora attuale dell'orologio di sistema del dispositivo entro un paio di secondi, l'ora non verrà modificata. In questo caso di test, a condizione che i suggerimenti non siano 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 come impostazione predefinita 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 il confronto con l'output nello scenario di test, di seguito è riportato un esempio di output tipico in cui il dispositivo riceve suggerimenti sull'ora sia dalle origini orarie 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}