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 data e hora, manualmente por usuário ou pela detecção automática de horário, e por uma destas opções:
telephony
usa sinais de telefonia de identidade e fuso horário da rede (NITZ, na sigla em inglês).- O
network
usa servidores de tempo do Network Time Protocol (NTP).
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, o tempo do Sistema Global de Navegação por Satélite (GNSS) é fornecido como uma fonte de tempo do sistema para você usar quando a conectividade de rede não estiver disponível.
Essa versão do Android oferece mais duas opções para detectar e definir o horário automaticamente:
gnss
usa sistemas globais de navegação por satélite (GNSS, na sigla em inglês).external
usa uma propriedade VHAL ou a API System.
Ativar a detecção automática de horário
Para ativar a detecção automática de hora, selecione Configurações > Data e hora > Data e hora automáticas:
Figura 1. Selecionar 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
em que essas fontes de tempo precisam ser consideradas, modifique o arquivo de configuração
de recursos 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 considerados na
detecção automática de tempo, e as sugestões de tempo telephony
são priorizadas
em relação às sugestões de tempo network
.
De modo geral, as sugestões de uma fonte de prioridade mais alta são ignoradas se forem inválidas ou muito antigas. Além disso, se a sugestão válida de maior prioridade corresponder ao horário do relógio do sistema atual do dispositivo com uma margem de vários segundos (o valor padrão é de dois (2) segundos), o horário não será alterado.
Limite de tempo inferior
O Android 12 oferece um novo período mínimo para usar ao validar sugestões de tempo. Antes desse recurso, a detecção automática de tempo não validava o horário UTC sugerido. Com esse recurso, os tempos que transcorrem antes do limite inferior são descartados.
O valor limite mínimo é determinado a partir de uma data derivada do carimbo de data/hora do build. Isso funciona com o princípio de que um tempo válido não pode ocorrer antes que a imagem do sistema seja criada. O Android não aplica um limite superior.
Sugestões de horário do GNSS
A fonte de tempo gnss
é nova no Android 12 e é fornecida por sinais de GPS. Essa é
uma fonte confiável para o tempo quando telephony
e network
não estão disponíveis.
Essa opção é adicionada ao novo GnssTimeUpdateService
no
SystemServer, que detecta passivamente as atualizações de local. Quando um local válido é recebido,
GnssTimeUpdateService
faz uma sugestão para TimeDetectorService
, que
determina se o relógio do sistema precisa ser atualizado.
Por padrão, a origem de tempo gnss
não está ativada no AOSP e, portanto,
precisa ser ativada 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 ativar esse recurso:
- Atualize
config_enableGnssTimeUpdateService
. O valor deconfig_enableGnssTimeUpdateService
precisa ser definido comotrue
. - Atualize
config_autoTimeSourcesPriority
.gnss
precisa ser adicionado à lista de itens deconfig_autoTimeSourcesPriority
. A posição degnss
na lista de prioridades determina a prioridade dada às sugestões de GNSS em relação aos valores de outras fontes.
Impacto na energia
O GnssTimeUpdateService
detecta passivamente as atualizações de localização, o que significa que ele
nunca ativa ativamente o GPS para consumir mais energia. Como resultado, a energia consumida quando
a fonte GNSS está ativa é insignificante. Isso também significa que, a menos que outro app ou serviço no
sistema solicite ativamente atualizações de localização, GnssTimeUpdateService
não vai receber uma atualização
de localização nem sugerir um horário do GNSS.
Teste
Conjunto de teste de compatibilidade (CTS)
Um teste do CTS é fornecido para verificar se a hora fornecida pelo GNSS está disponível. Confira detalhes em
LocationShellCommand.java
.
Testes de unidade
Confira os testes de unidade básicos no seguinte arquivo:
atest frameworks/base/services/tests/servicestests/src/com/android/server/timedetector/GnssTimeUpdateServiceTest.java
Testes manuais
Para testar esse recurso, novos comandos foram adicionados a
LocationShellCommand.java
. Use esses comandos para adicionar provedores de teste com os quais você pode especificar um local e o horário do GNSS associado.
O GnssTimeUpdateService
ouve essas atualizações de localização e faz sugestões
periodicamente.
Observação:a interface desses 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 de horário externas são outra forma de fornecer sugestões de horário automáticas para o Android. Essas novas opções permitem fornecer ao Android sugestões de horário totalmente personalizadas, que podem originar de várias ECUs que, por sua vez, podem usar uma combinação de um relógio em tempo real, GNSS, NITZ ou qualquer outra fonte de horário.
As sugestões a seguir estão disponíveis no Android 12 para serem consideradas como sugestões de tempo
external
:
- Propriedades VHAL. Uma nova
propriedade VHAL
chamada
EPOCH_TIME
foi fornecida. Essa propriedade indica o número de milissegundos decorridos desde 1/1/1970 UTC. O valor pode ser transmitido para oTimeManager
do Android para sugerir um novo horário do sistema. Um exemplo de implementação do VHAL que atualiza essa propriedade é fornecido na implementação de referência abaixo. - APIs do sistema. Um novo método chamado
suggestExternalTime()
está disponível no TimeManager para fornecer ao sistema uma sugestão de horário externo. Se o sistema estiver configurado para levar em conta sugestões de tempo externas (usandoconfig_autoTimeSourcesPriority
no arquivo de configuração), o carimbo de data/hora transmitido para esse método será usado para definir o tempo do sistema, se não houver sugestões de tempo de prioridade mais alta disponíveis.
É possível implementar uma solução de tempo externa conforme descrito abaixo:
- Atualize o arquivo de configuração de recursos (
core/res/res/values/config.xml
) e adicione o valorexternal
aconfig_autoTimeSourcesPriority
:<string-array name="config_autoTimeSourcesPriority> <item>external</item> <item>gnss</item> </string-array>
Isso instrui o Android a dar a maior prioridade às sugestões de horário externo ao definir o relógio do sistema. O hardware no veículo grava uma sugestão de carimbo de data/hora na nova
EPOCH_TIME
propriedade VHAL. - Um app fornecido pelo fornecedor lê essa propriedade e chama
TimeManager.suggestExternal()
. O Android pode usar o carimbo de data/hora fornecido como o novo valor do relógio do sistema.