Prioridade da fonte de tempo

O framework do Android usa várias fontes de tempo para sincronização. Nesta página, abordamos o Network Time Protocol (NTP) e Origens de horário automáticas de identidade de rede e fuso horário (NITZ, na sigla em inglês). Por padrão, no Android 12 ou em versões mais recentes, o framework prioriza NTP como fonte de tempo em vez de NITZ, pois NTP é mais preciso e confiável do que o NITZ. Em situações em que o NTP não está disponível, a estrutura usa NITZ. Isso é uma inversão da prioridade padrão em relação às versões anteriores do de plataforma. Por padrão, no Android 11 e versões anteriores, o framework prioriza o NITZ pelo NTP.

Para mais detalhes sobre essa mudança, consulte os seguintes patches do AOSP: 1563678, 1513323.

Configurar a prioridade da fonte de horário

Para configurar qual fonte de tempo tem prioridade por padrão em um dispositivo Android específico versão, configure a config_autoTimeSourcesPriority em frameworks/base/core/res/res/values/config.xml no tempo de build. Horário as sugestões da fonte de horário que for mais alta na lista têm prioridade. em relação às origens mais baixas na lista.

As origens de horário do Android que podem ser configuradas estão em TimeDetectorStrategy.java As origens a seguir estão configuradas para uso por padrão:

  • Telefonia (NITZ)
  • Rede (NTP)

Teste

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

  1. Verifique se há um chip funcionando no DUT
  2. Desative os dados móveis e o Wi-Fi
  3. Coloque o dispositivo no modo avião para verificar se o rádio celular está desligado
  4. Desativar a detecção automática de tempo
  5. Definir o relógio manualmente para um valor de hora incorreto no futuro
  6. Reinicialize o dispositivo.
  7. Ativar a detecção automática de tempo
  8. Tire o dispositivo do modo avião

Essas etapas acionam uma mudança no relógio do sistema assim que um NITZ sinal seja recebido. Para verificar como o horário do dispositivo está definido, execute o seguinte: comando:

adb shell dumpsys time_detector

Para confirmar que o relógio do sistema usa NITZ, confirme o seguinte no comando saída:

  • A mEnvironment.isAutoTimeDetectionEnabled() está true.
  • mEnvironment.autoOriginPriorities() contém uma lista de fontes de horário. com as origens 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 está definido usando uma sugestão de telefonia.
  • A seção Telephony suggestion history contém sugestões de horários.
  • A seção Network suggestion history está vazia.

As sugestões de horário nos campos Telephony suggestion history e As seções Network suggestion history são consideradas a fonte da verdade para tempo de resposta. Se o dispositivo estiver conectado à Internet e tiver um chip, as sugestões são gerados usando NTP (rede) e NITZ (telefonia). Nesse caso de teste, somente a seção Telephony suggestion history contém sugestões, porque O NTP está desativado.

A seção Time change log registra as alterações feitas nos arquivos relógio do sistema e a sugestão usada. O relógio do sistema é definido com base no das fontes de horário na lista de prioridades em a tecla config_autoTimeSourcesPriority. No entanto, as sugestões de um a origem de maior prioridade poderá ser ignorada se a sugestão for muito antiga ou inválida. Além disso, se a sugestão válida de maior prioridade corresponder ao código a hora do relógio do sistema dentro de alguns segundos, a hora não será alterada. Neste caso de teste, contanto que as sugestões não estejam desatualizadas, o relógio do sistema é definido usando uma das sugestões do Telephony suggestion history.

Este é um exemplo de saída em que o dispositivo volta a usar o NITZ quando o NTP estiver 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 uma comparação com a saída no cenário de teste, a este é um exemplo de saída típica em que o dispositivo recebe sugestões de horários das fontes 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}