Detecção Automática de Tempo

A detecção automática de horário recebe sugestões de horário de várias fontes, seleciona a melhor opção e define o relógio do sistema no Android para corresponder. As versões anteriores do Android ofereciam duas maneiras de definir a data e a hora — definida manualmente por usuário ou por detecção automática de hora, definida por uma destas duas opções:

  • a telefonia usa sinais de telefonia de Identidade de Rede e Fuso Horário (NITZ).
  • A rede usa servidores de horário NTP (Network Time Protocol).

Cada opção requer conexões com redes externas, que nem sempre estão disponíveis no Android Automotive. Por exemplo, em alguns países, alguns carros podem não ter telefonia integrada. Portanto, a hora dos Sistemas Globais de Navegação por Satélite (GNSS) agora também é fornecida como uma fonte de hora do sistema para você usar quando a conectividade de rede não estiver disponível.

Esta próxima versão do Android oferece mais duas opções para detectar e definir o horário automaticamente:

  • O gnss usa Sistemas Globais de Navegação por Satélite (GNSS).
  • external usa uma propriedade VHAL ou a API do sistema.

Ativar detecção automática de tempo

Para habilitar a detecção automática de hora, certifique-se de selecionar Configurações > Data e hora > Data e hora automáticas :

Figura 1. Selecione Data e Hora Automáticas

Configurar fontes de tempo

Para especificar quais fontes de tempo incluir na detecção automática de tempo e a prioridade na qual essas fontes de tempo devem ser consideradas, você deve modificar o arquivo de configuração de recurso do dispositivo, core/res/res/values/config.xml :

<!-- Specifies priority of automatic time sources. Suggestions from higher entries in the list
     take precedence over lower ones. See com.android.server.timedetector.TimeDetectorStrategy for
     available sources. -->
<string-array name="config_autoTimeSourcesPriority">
    <item>telephony</item>
    <item>network</item>
</string-array>

Neste exemplo, telephony e network são consideradas na detecção automática de horário e as sugestões de horário de telephony são priorizadas antes das sugestões de horário da network .

De um modo geral, as sugestões de uma fonte de prioridade mais alta são ignoradas se a sugestão for inválida ou se for muito antiga. 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 (o valor padrão é dois (2) segundos), a hora não será alterada.

Limite de tempo inferior

O Android 12 fornece um novo limite de tempo menor para uso ao validar sugestões de tempo. Antes desse recurso, a detecção automática de horário não validava o horário UTC de entrada sugerido. Com este recurso, os tempos que decorrem antes do limite inferior são descartados.

O valor do limite inferior é determinado a partir de uma data derivada do carimbo de data/hora da compilação. Isso funciona com base no princípio de que um tempo válido não pode ocorrer antes da criação da imagem do sistema. O Android não impõe um limite superior.

Sugestões de tempo GNSS

A fonte de tempo gnss é nova no Android 12 e é fornecida por sinais de GPS. Esta é considerada uma fonte confiável de tempo quando a telefonia e a rede não estão disponíveis. Esta opção é adicionada ao novo GnssTimeUpdateService no SystemServer que escuta passivamente as atualizações de localização. Quando uma localização válida é recebida, GnssTimeUpdateService faz uma sugestão para TimeDetectorService , que então determina se o relógio do sistema deve ser atualizado.

Por padrão, a fonte de tempo gnss não está habilitada no AOSP e, portanto, deve ser habilitada pelos parceiros:

<!-- Specifies priority of automatic time sources. Suggestions from higher entries in the list
    take precedence over lower ones.
    See com.android.server.timedetector.TimeDetectorStrategy for available sources. -->
<string-array name="config_autoTimeSourcesPriority">
    <item>telephony</item>
    <item>network</item>
    <item>gnss</item>
</string-array>

<!-- Enables the GnssTimeUpdate service. This is the global switch for enabling Gnss time based
    suggestions to TimeDetector service. See also config_autoTimeSourcesPriority. -->
<bool name="config_enableGnssTimeUpdateService">true</bool>

Para habilitar este recurso:

  1. Atualize config_enableGnssTimeUpdateService. O valor para config_enableGnssTimeUpdateService deve ser definido como true .
  2. Atualize config_autoTimeSourcesPriority . gnss deve ser adicionado à lista de itens para config_autoTimeSourcesPriority . A posição do gnss na lista de prioridades determina a prioridade dada às sugestões GNSS, em relação aos valores de outras fontes.

Impacto no poder

GnssTimeUpdateService escuta passivamente as atualizações de localização, o que significa que ele nunca liga ativamente o GPS para consumir energia adicional. Como resultado, a energia consumida quando a fonte GNSS está habilitada é insignificante. Isso também significa que, a menos que outro aplicativo ou serviço no sistema solicite ativamente atualizações de localização, o GnssTimeUpdateService não obtém uma atualização de localização e sugere um horário GNSS.

Teste

Conjunto de testes de compatibilidade (CTS)

Um teste CTS é fornecido para verificar se um tempo fornecido pelo GNSS está disponível. Para obter detalhes, consulte LocationManagerCoarseTest.java .

Testes de unidade

Veja os testes básicos de unidade no arquivo a seguir:

atest frameworks/base/services/tests/servicestests/src/com/android/server/timedetector/GnssTimeUpdateServiceTest.java

Testes manuais

Para testar esse recurso, novos comandos foram adicionados ao LocationShellCommand.java . Use esses comandos para adicionar provedores de teste com os quais você pode especificar um local e o horário GNSS associado. GnssTimeUpdateService ouve essas atualizações de localização e faz sugestões periodicamente.

Nota: A interface para esses comandos pode mudar entre as versões.

# Enable Master Location Switch in the foreground user (usually user 10 on automotive).
# If you just flashed, this can be done through Setup Wizard.
adb shell cmd location set-location-enabled true --user 10

# Add GPS test provider (this usually fails the first time and will throw a SecurityException
# with "android from <some-uid> not allowed to perform MOCK_LOCATION".)
adb shell cmd location providers add-test-provider gps

# Enable mock location permissions for previous UID
adb shell appops set <uid printed in previous error> android:mock_location allow

# Add GPS test provider (Should work with no errors.)
adb shell cmd location providers add-test-provider gps

# Enable GPS test provider
adb shell cmd location providers set-test-provider-enabled gps true

# Set location with time (time can't be earlier than the limit set by the lower bound.)
adb shell cmd location providers set-test-provider-location gps --location <LATITUDE>,<LONGITUDE> --time <TIME>

Sugestões de horário externo

As sugestões externas de horário são outra maneira de fornecer sugestões automáticas de horário para o Android. Essas novas opções permitem que você forneça sugestões de tempo totalmente personalizadas para o Android, que podem se originar de várias ECUs que, por sua vez, podem usar uma combinação de relógio em tempo real, GNSS, NITZ ou qualquer outra fonte de tempo.

As sugestões a seguir estão agora disponíveis no Android 12 para serem consideradas como sugestões external tempo:

  • Propriedades VHAL. Uma nova propriedade VHAL chamada EPOCH_TIME é fornecida. Esta propriedade denota o número de milissegundos decorridos desde 01/01/1970 UTC. Seu valor pode ser passado para o Android TimeManager para sugerir uma nova hora do sistema. Uma implementação de VHAL de amostra que atualiza essa propriedade é fornecida na implementação de referência abaixo.
  • APIs do sistema. Um novo método suggestExternalTime() agora está disponível no TimeManager para fornecer ao sistema uma sugestão de hora externa. Se o sistema estiver configurado para levar em consideração sugestões de horário externas (usando config_autoTimeSourcesPriority no arquivo de configuração), o carimbo de data e hora passado para esse método será usado para definir a hora do sistema, se não houver sugestões de horário de prioridade mais alta disponíveis.

Você pode implementar uma solução de tempo externa conforme descrito abaixo:

  1. Atualize o arquivo de configuração do recurso ( core/res/res/values/config.xml ) e adicione o valor external a config_autoTimeSourcesPriority :
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>
    

    Isso instrui o Android a dar às sugestões externas de horário a maior prioridade ao configurar o relógio do sistema. O hardware do veículo grava uma sugestão de carimbo de data/hora na nova propriedade EPOCH_TIME VHAL .

  2. Um aplicativo fornecido pelo fornecedor lê essa propriedade e chama TimeManager.suggestExternal() . O Android pode então usar o timestamp fornecido como o novo valor do relógio do sistema.