Il framework Android utilizza varie origini temporali per la sincronizzazione dell'ora. Questa pagina si concentra sul Network Time Protocol (NTP) e sulle origini temporali automatiche Network Identity and Time Zone (NITZ). Per impostazione predefinita in Android 12 o versioni successive, il framework assegna la 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 esegue il fallback su 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 ulteriori dettagli su questa modifica, consulta le seguenti patch AOSP: 1563678, 1513323.
Configurare la priorità dell'origine ora
Per configurare l'origine ora che ha la priorità per impostazione predefinita per una versione specifica di Android, configura la chiave config_autoTimeSourcesPriority
in frameworks/base/core/res/res/values/config.xml
al momento della build. I suggerimenti
sull'ora provenienti dall'origine dell'ora che si trova più in alto nell'elenco hanno la precedenza
sulle origini che si trovano più in basso nell'elenco.
Le origini ora di Android configurabili si trovano in
TimeDetectorStrategy.java
.
Per impostazione predefinita, sono configurate le seguenti origini:
- 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:
- Assicurati che nel DUT sia presente una SIM funzionante
- Disattivare i dati mobili e il Wi-Fi
- Attiva la modalità aereo per assicurarti che la radio cellulare sia disattivata
- Disattivare il rilevamento automatico dell'ora
- Imposta manualmente l'orologio su un valore di tempo errato nel futuro
- Riavvia il dispositivo
- Attivare il rilevamento automatico dell'ora
- Disattiva la modalità aereo sul dispositivo
Questi passaggi attivano una modifica dell'orologio di sistema non appena viene ricevuto un segnale NITZ. 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 nell'output del comando:
mEnvironment.isAutoTimeDetectionEnabled()
true
.mEnvironment.autoOriginPriorities()
contiene un elenco di origini temporali con le origini più in alto nell'elenco che hanno la precedenza su quelle 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 sull'orario nelle sezioni Telephony suggestion history
e Network suggestion history
sono considerati la fonte di verità per l'orario. Se il dispositivo è connesso a internet e ha una scheda SIM, i suggerimenti
vengono generati utilizzando sia NTP (rete) sia NITZ (telefonia). In questo scenario di test,
solo la sezione Telephony suggestion history
contiene suggerimenti perché
la nuova scheda è disattivata.
La sezione Time change log
registra le modifiche apportate all'orologio di sistema del dispositivo e il suggerimento utilizzato. L'orologio di sistema è impostato in base all'ordine delle origini ora nell'elenco di priorità nella chiave config_autoTimeSourcesPriority
. Tuttavia, i suggerimenti provenienti da una fonte con priorità più alta potrebbero essere ignorati se sono troppo vecchi o non validi.
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, finché 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 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}
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 dalle origini ora 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}