Detecção de horário do GNSS

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