No Android 12 e versões mais recentes, o Android pode usar opcionalmente um
Sistema Global de Navegação por Satélite (GNSS) para sugerir tempos de época Unix ao
serviço time_detector
.
Essa opção não é ativada por padrão no AOSP.
Quando a detecção de horário do GNSS está ativada, o gnss_time_update_service
ouve passivamente
atualizações de localização de fontes do GNSS e envia sugestões do GNSS para o
serviço time_detector
. Em seguida, o serviço time_detector
determina se é necessário atualizar o relógio do sistema para corresponder à sugestão.
Impacto no uso de energia
O AOSP gnss_time_update_service
escuta passivamente as atualizações de localização. Isso significa que o serviço nunca ativa o GPS nem consome energia adicional. Isso também significa que, a menos que outro app ou serviço no sistema esteja
solicitando atualizações de local ativamente, gnss_time_update_service
não vai receber uma
atualização de local e sugerir um horário do GNSS.
Implementação
Para ativar a detecção de hora do GNSS, os fabricantes de dispositivos precisam ativar explicitamente
gnss_time_update_service
no servidor do sistema.
Os valores config_enableGnssTimeUpdateService
e config_autoTimeSourcesPriority
no arquivo core/res/res/values/config.xml
precisam ser atualizados para ativar esse recurso. Defina o valor de config_enableGnssTimeUpdateService
como true
e adicione gnss
à lista de itens de config_autoTimeSourcesPriority
. A posição de gnss
na lista de prioridade determina a prioridade dada às sugestões do GNSS em relação às de outras fontes.
Confira a seguir um exemplo de arquivo core/res/res/values/config.xml
em que a detecção de hora do GNSS está ativada e gnss
é o terceiro na lista de prioridade depois de network
e telephony
:
<!-- 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>network</item>
<item>telephony</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>
Depurar e testar
Para testar a detecção de hora do GNSS, use comandos adb shell cmd location
.
Use esses comandos para adicionar provedores de locais de teste em que é possível especificar um
local e a hora GNSS associada. O gnss_time_update_service
escuta essas atualizações de localização e faz sugestões periodicamente.
Confira a seguir exemplos de comandos adb shell cmd location
:
Ative a chave de localização mestre para o usuário em primeiro plano (geralmente o usuário
10
em veículos). Se você acabou de fazer o flash, isso pode ser feito pelo assistente de configuração.adb shell cmd location set-location-enabled true --user 10
Adicione o provedor de teste de GPS (geralmente falha na primeira vez e gera uma exceção de segurança com
android from <SOME_UID> not allowed to perform MOCK_LOCATION
)adb shell cmd location providers add-test-provider gps
Ativar permissões de localização simulada para UID anterior
adb shell appops set UID_PRINTED_IN_PREVIOUS_ERROR android:mock_location allow
Adicionar provedor de teste de GPS (deve funcionar sem erros)
adb shell cmd location providers set-test-provider-enabled gps true
Ativar o provedor de teste de GPS
adb shell cmd location providers set-test-provider-enabled gps true
Defina o local com o tempo (o tempo não pode ser menor que o limite definido pelo limite inferior)
adb shell cmd location providers set-test-provider-location gps --location LATITUDE,LONGITUDE --time TIME