Detección automática de tiempo

La detección automática de hora recibe sugerencias de hora 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 hora, y configuradas mediante una de estas opciones:

  • telephony utiliza señales de telefonía de identidad de red y zona horaria (NITZ).
  • network utiliza servidores de hora del 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 incorporada. Por lo tanto, la hora de los sistemas globales de navegación por satélite (GNSS) se proporciona como fuente de hora del sistema para que la utilice cuando la conectividad de red no esté disponible.

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

  • gnss utiliza sistemas globales de navegación por satélite (GNSS).
  • external utiliza 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 hora y las sugerencias de hora telephony se priorizan antes que las sugerencias de hora network .

En términos generales, las sugerencias de una fuente de mayor prioridad se ignoran si no son válidas o si son demasiado antiguas. Además, si la sugerencia válida de mayor prioridad coincide con la hora actual del reloj del sistema del dispositivo dentro de 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 más bajo para usar al validar sugerencias de tiempo. Antes de esta función, 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 del 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 un tiempo válido antes de que se creara la imagen del sistema. Android no impone un límite superior.

Sugerencias de hora GNSS

La fuente de hora gnss es nueva en Android 12 y se proporciona mediante señales de GPS. Esta es una fuente confiable para cuando telephony y network 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 el reloj del sistema debe actualizarse.

De forma predeterminada, la fuente de hora 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 dada a las sugerencias de 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 esté disponible una hora proporcionada por GNSS. Para obtener más información, consulte LocationShellCommand.java .

Pruebas unitarias

Vea 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 pueda especificar una ubicación y la hora GNSS asociada. GnssTimeUpdateService escucha estas actualizaciones de ubicación y periódicamente hace sugerencias.

Nota: La interfaz de 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 hora externas son otra forma de proporcionar sugerencias de hora automáticas a Android. Esta nueva opción le permite proporcionar sugerencias de tiempo totalmente personalizadas a Android, que pueden originarse desde varias ECU que, a su vez, pueden usar una combinación de un reloj en tiempo real, GNSS, NITZ o cualquier otra fuente de tiempo.

Las siguientes sugerencias 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 al TimeManager de Android para sugerir una nueva hora del sistema. En la implementación de referencia siguiente se proporciona una implementación de VHAL de ejemplo que actualiza esta propiedad.
  • API del sistema. Un nuevo método llamado suggestExternalTime() está disponible en TimeManager para proporcionar al sistema una sugerencia de tiempo externa. Si el sistema está configurado para tener en cuenta sugerencias de hora externas (usando config_autoTimeSourcesPriority en el archivo de configuración), la marca de tiempo pasada a este método se usa para configurar la hora del sistema, si no hay sugerencias de hora 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, le indica a Android que dé la máxima prioridad a las sugerencias de hora externas 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 TimeManager.suggestExternal() . Luego, Android puede usar la marca de tiempo proporcionada como el nuevo valor del reloj del sistema.