Detección automática de tiempo

La detección automática de tiempo recibe sugerencias de tiempo de varias fuentes, selecciona la mejor opción y luego configura el reloj del sistema en Android para que coincida. Las versiones anteriores de Android ofrecían dos formas de configurar la fecha y la hora, ya sea manualmente por usuario o mediante detección automática de la hora, configurada mediante una de estas dos opciones:

  • la telefonía utiliza señales de telefonía de identidad de red y zona horaria (NITZ).
  • La red utiliza servidores de tiempo de protocolo de tiempo de red (NTP).

Cada opción requiere conexiones a redes externas, que no siempre están disponibles en Android Automotive. Por ejemplo, en algunos países, es posible que algunos automóviles no tengan telefonía integrada. Por lo tanto, la hora de los sistemas de navegación por satélite global (GNSS) ahora también se proporciona como una fuente de hora del sistema para que la use cuando la conectividad de la red no esté disponible.

Esta próxima versión de Android ofrece dos opciones más para detectar y establecer la hora automáticamente:

  • gnss utiliza Sistemas Globales de Navegación por Satélite (GNSS).
  • external usa una propiedad VHAL o la API del sistema.

Habilitar la detección automática de tiempo

Para habilitar la detección automática de la hora, asegúrese de seleccionar Configuración > Fecha y hora > Fecha y hora automáticas :

Figura 1. Seleccionar fecha y hora automáticas

Configurar fuentes de tiempo

Para especificar qué fuentes de tiempo incluir en la detección automática de tiempo y la prioridad en la que se deben considerar estas fuentes de tiempo, debe modificar el archivo de configuración de recursos del 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>

En este ejemplo, telephony y network se consideran en la detección automática de tiempo y las sugerencias de tiempo de telephony se priorizan antes que las sugerencias de tiempo de network .

En términos generales, las sugerencias de una fuente de mayor prioridad se ignoran si la sugerencia no es válida o si la sugerencia es demasiado antigua. Además, si la sugerencia válida de mayor prioridad coincide con la hora del reloj del sistema actual del dispositivo en varios segundos (el valor predeterminado es dos (2) segundos), la hora no se cambiará.

límite de tiempo inferior

Android 12 proporciona un nuevo límite de tiempo inferior para usar al validar sugerencias de tiempo. Antes de esta característica, la detección automática de la hora no validaba la hora UTC entrante sugerida. Con esta característica, se descartan los tiempos que transcurren antes del límite inferior.

El valor límite inferior se determina a partir de una fecha derivada de la marca de tiempo de compilación. Esto funciona según el principio de que no puede ocurrir una hora válida antes de que se construya la imagen del sistema. Android no impone un límite superior.

Sugerencias de tiempo GNSS

La fuente de tiempo gnss es nueva en Android 12 y la proporcionan las señales de GPS. Esto se considera una fuente confiable para el tiempo cuando la telefonía y la red no están disponibles. Esta opción se agrega al nuevo GnssTimeUpdateService en SystemServer que escucha pasivamente las actualizaciones de ubicación. Cuando se recibe una ubicación válida, GnssTimeUpdateService hace una sugerencia a TimeDetectorService , que luego determina si se debe actualizar el reloj del sistema.

De forma predeterminada, la fuente de tiempo gnss no está habilitada en AOSP y, por lo tanto, los socios deben habilitarla:

<!-- 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 esta característica:

  1. Actualice config_enableGnssTimeUpdateService. El valor de config_enableGnssTimeUpdateService debe establecerse en true .
  2. Actualice config_autoTimeSourcesPriority . gnss debe agregarse a la lista de elementos para config_autoTimeSourcesPriority . La posición de gnss en la lista de prioridades determina la prioridad otorgada a las sugerencias GNSS, con respecto a los valores de otras fuentes.

Impacto en el poder

GnssTimeUpdateService escucha pasivamente las actualizaciones de ubicación, lo que significa que nunca enciende activamente el GPS para consumir energía adicional. Como resultado, la energía consumida cuando la fuente GNSS está habilitada es insignificante. Esto también significa que, a menos que otra aplicación o servicio en el sistema solicite activamente actualizaciones de ubicación, GnssTimeUpdateService no obtiene una actualización de ubicación ni sugiere una hora GNSS.

Pruebas

Conjunto de pruebas de compatibilidad (CTS)

Se proporciona una prueba CTS para verificar que un tiempo proporcionado por GNSS está disponible. Para obtener más información, consulte LocationManagerCoarseTest.java .

Pruebas unitarias

Ver las pruebas unitarias básicas en el siguiente archivo:

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

Pruebas manuales

Para probar esta característica, se agregaron nuevos comandos a LocationShellCommand.java . Utilice estos comandos para agregar proveedores de pruebas con los que puede especificar una ubicación y el tiempo GNSS asociado. GnssTimeUpdateService escucha estas actualizaciones de ubicación y hace sugerencias periódicamente.

Nota: La interfaz para estos comandos puede cambiar entre versiones.

# 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>

Sugerencias de tiempo externo

Las sugerencias de tiempo externas son otra forma de proporcionar sugerencias de tiempo automáticas a Android. Esta nueva opción le permite proporcionar sugerencias de tiempo totalmente personalizadas para Android, que pueden originarse en varias ECU que, a su vez, pueden usar una combinación de reloj en tiempo real, GNSS, NITZ o cualquier otra fuente de tiempo.

Las siguientes sugerencias ahora están disponibles en Android 12 para considerarlas como sugerencias de tiempo external :

  • propiedades VHAL. Se proporciona una nueva propiedad VHAL denominada EPOCH_TIME . Esta propiedad indica el número de milisegundos que han transcurrido desde el 1/1/1970 UTC. Su valor se puede pasar a Android TimeManager para sugerir una nueva hora del sistema. Una implementación de VHAL de muestra que actualiza esta propiedad se proporciona en la implementación de referencia a continuación.
  • API del sistema. Ahora está disponible un nuevo método llamado suggestExternalTime() en TimeManager para proporcionar al sistema una sugerencia de hora externa. Si el sistema está configurado para tener en cuenta sugerencias de tiempo externas (usando config_autoTimeSourcesPriority en el archivo de configuración), la marca de tiempo pasada a este método se usa para establecer la hora del sistema, si no hay sugerencias de tiempo de mayor prioridad disponibles.

Puede implementar una solución de tiempo externo como se describe a continuación:

  1. Actualice el archivo de configuración de recursos ( core/res/res/values/config.xml ) y luego agregue el valor external a config_autoTimeSourcesPriority :
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>
    

    Al hacerlo, se le indica a Android que le dé a las sugerencias de tiempo externo la máxima prioridad al configurar el reloj del sistema. El hardware del vehículo escribe una sugerencia de marca de tiempo en la nueva propiedad EPOCH_TIME VHAL .

  2. Una aplicación proporcionada por el proveedor lee esta propiedad y llama a TimeManager.suggestExternal() . Luego, Android puede usar la marca de tiempo proporcionada como el nuevo valor del reloj del sistema.