Il framework Android utilizza diverse origini dell'ora per la sincronizzazione dell'ora. Questa pagina è incentrata sulle origini temporali automatiche del Network Time Protocol (NTP) e dell'identità di rete e del fuso orario (NITZ). Per impostazione predefinita, in Android 12 o versioni successive, il framework assegna la priorità a NTP come fonte di tempo rispetto a NITZ, perché NTP è più accurata 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 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.
Configura la priorità dell'origine ora
Per configurare l'origine ora che ha la priorità per impostazione predefinita per una versione di Android specifica, configura la chiave config_autoTimeSourcesPriority
in frameworks/base/core/res/res/values/config.xml
al momento della build. I suggerimenti di orario provenienti dalla sorgente temporale più in alto hanno la precedenza sulle origini più basse.
Le origini orario Android che possono essere configurate 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 (se i dati mobili e il Wi-Fi sono disattivati), procedi nel seguente modo:
- Assicurati che nel corso sia presente una SIM funzionante
- Disattivare i dati mobili e il Wi-Fi
- Attiva la modalità aereo sul dispositivo per assicurarti che il segnale radio cellulare sia disattivato
- Disattivare il rilevamento automatico del tempo
- Imposta manualmente l'orologio su un valore di ora errato nel futuro
- Riavviare il dispositivo
- Attivare il rilevamento automatico del tempo
- Disattiva la modalità aereo del dispositivo
Questi passaggi attivano una modifica dell'orologio di sistema non appena viene ricevuto un segnale NITZ. Per verificare 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 nell'output del comando:
mEnvironment.isAutoTimeDetectionEnabled()
true
.mEnvironment.autoOriginPriorities()
contiene un elenco di origini temporali con origini più alte nell'elenco che hanno la precedenza su quelle più inferiori nell'elenco.- La sezione
Time change log
mostra che l'orologio di sistema viene impostato utilizzando un suggerimento di telefonia. - La sezione
Telephony suggestion history
contiene suggerimenti basati sull'ora. - La sezione
Network suggestion history
è vuota.
I suggerimenti di orario nelle sezioni Telephony suggestion history
e
Network suggestion history
sono considerati la fonte attendibile per
il tempo. Se il dispositivo è connesso a internet e ha una scheda SIM, i 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 è 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 temporali nell'elenco di priorità
nel tasto config_autoTimeSourcesPriority
. Tuttavia, i suggerimenti di un'origine con priorità più elevata potrebbero essere ignorati se il suggerimento è troppo vecchio o non valido.
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, 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 un output in cui il dispositivo utilizza nuovamente 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 output tipico in cui il dispositivo riceve suggerimenti di tempo da origini di tempo 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}