Prioridade de fonte de tempo

A estrutura Android usa várias fontes de horário para sincronização de horário. Esta página se concentra nas fontes de horário automáticas Network Time Protocol (NTP) e Network Identity and Time Zone (NITZ). Por padrão no Android 12 ou superior, a estrutura prioriza o NTP como fonte de tempo em vez do NITZ porque o NTP é mais preciso e confiável do que o NITZ. Em situações em que o NTP não está disponível, a estrutura recorre ao NITZ. Esta é uma reversão da prioridade padrão das versões anteriores da plataforma. Por padrão no Android 11 e versões anteriores, a estrutura prioriza NITZ em vez de NTP.

Para obter mais detalhes sobre essa alteração, consulte os seguintes patches AOSP: 1563678 , 1513323 .

Configurando a prioridade da fonte de tempo

Para configurar qual fonte de tempo tem prioridade por padrão para uma versão específica do Android, configure a chave config_autoTimeSourcesPriority em frameworks/base/core/res/res/values/config.xml no momento da compilação. As sugestões de horário da fonte de horário mais alta na lista têm precedência sobre as fontes que estão mais abaixo na lista.

As fontes de horário do Android que podem ser configuradas são encontradas em TimeDetectorStrategy.java . As seguintes fontes são configuradas para uso por padrão:

  • Telefonia (NITZ)
  • Rede (NTP)

Teste

Para verificar se o dispositivo usa NITZ quando o NTP não está disponível (quando os dados móveis e o Wi-Fi estão desativados), faça o seguinte:

  1. Certifique-se de que haja um SIM funcionando no DUT
  2. Desligue dados móveis e Wi-Fi
  3. Coloque o dispositivo no modo avião para garantir que o rádio celular esteja desligado
  4. Desative a detecção automática de hora
  5. Acerte o relógio manualmente para um valor de hora incorreto no futuro
  6. Reinicie o dispositivo
  7. Ative a detecção automática de hora
  8. Tire o dispositivo do modo avião

Essas etapas acionam uma alteração no relógio do sistema assim que um sinal NITZ é recebido. Para verificar como a hora do dispositivo está definida, execute o seguinte comando:

adb shell dumpsys time_detector

Para verificar se o relógio do sistema usa NITZ, confirme o seguinte na saída do comando:

  • mEnvironment.isAutoTimeDetectionEnabled() é true .
  • mEnvironment.autoOriginPriorities() contém uma lista de fontes de tempo com as fontes mais altas na lista tendo precedência sobre as fontes mais baixas na lista.
  • A seção Time change log mostra que o relógio do sistema foi acertado usando uma sugestão de telefonia.
  • A seção Telephony suggestion history contém sugestões de horário.
  • A seção Network suggestion history está vazia.

As sugestões de tempo nas seções Telephony suggestion history e Network suggestion history são consideradas a fonte da verdade para o tempo. Caso o aparelho esteja conectado à internet e possua cartão SIM, as sugestões são geradas tanto por NTP (rede) quanto por NITZ (telefonia). Neste caso de teste, apenas a seção Telephony suggestion history contém sugestões porque o NTP está desabilitado.

A seção Time change log registra as alterações feitas no relógio do sistema do dispositivo e a sugestão utilizada. O relógio do sistema é definido com base na ordem das fontes de horário na lista de prioridades na chave config_autoTimeSourcesPriority . No entanto, sugestões de uma fonte de prioridade mais alta poderão ser ignoradas se a sugestão for muito antiga ou inválida. Além disso, se a sugestão válida de prioridade mais alta corresponder à hora atual do relógio do sistema do dispositivo em alguns segundos, a hora não será alterada. Neste caso de teste, desde que as sugestões não estejam desatualizadas, o relógio do sistema é acertado usando uma das sugestões do Telephony suggestion history .

A seguir está um exemplo de uma saída em que o dispositivo recorre ao uso de NITZ quando o NTP está indisponível.

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}

Para referência como comparação com a saída no cenário de teste, segue-se um exemplo de uma saída típica em que o dispositivo recebe sugestões de tempo de fontes de 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}