Detección automática de la hora

La detección automática de la hora recibe sugerencias de hora de varias fuentes, selecciona la mejor opción y, luego, establece el reloj del sistema en Android para que coincida. Las versiones anteriores de Android proporcionaban dos formas de establecer la fecha y la hora, ya sea de forma manual por usuario o mediante la detección automática de la hora, y se establecían con una de estas opciones:

  • telephony usa indicadores de telefonía de identidad de red y zona horaria (NITZ).
  • network usa servidores de hora del protocolo 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, el tiempo de los sistemas globales de navegación por satélite (GNSS) se proporciona como una fuente de tiempo del sistema para que la uses cuando la conectividad de red no esté disponible.

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

  • gnss usa sistemas globales de navegación por satélite (GNSS).
  • external usa una propiedad VHAL o la API de System.

Habilita la detección automática de la hora

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

Figura 1: Cómo seleccionar Fecha y hora automáticas

Configura las fuentes de tiempo

Para especificar qué fuentes de tiempo incluir en la detección de hora automática y la prioridad en la que se deben considerar estas fuentes, debes 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 la hora y las sugerencias de hora de telephony se priorizan antes que las de network.

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

Plazo de cumplimiento inferior

Android 12 proporciona un nuevo límite de tiempo inferior para usar cuando se validan las sugerencias de tiempo. Antes de esta función, la detección de hora automática no validaba la hora UTC entrante sugerida. Con esta función, 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 la compilación. Esto funciona según el principio de que no puede haber una hora válida antes de que se compilara la imagen del sistema. Android no aplica un límite superior.

Sugerencias de hora del GNSS

La fuente de tiempo gnss es nueva en Android 12 y la proporcionan los indicadores de GPS. Esta es una fuente confiable para el tiempo 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 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 función, haz lo siguiente:

  1. Actualiza config_enableGnssTimeUpdateService. El valor de config_enableGnssTimeUpdateService se debe establecer en true.
  2. Actualiza config_autoTimeSourcesPriority. Se debe agregar gnss a la lista de elementos de config_autoTimeSourcesPriority. La posición de gnss en la lista de prioridades determina la prioridad que se les otorga a las sugerencias de GNSS en relación con los valores de otras fuentes.

Impacto en la energía

GnssTimeUpdateService escucha pasivamente las actualizaciones de ubicación, lo que significa que nunca enciende el GPS de forma activa para consumir energía adicional. Como resultado, la energía que se consume cuando se habilita la fuente de GNSS es insignificante. Esto también significa que, a menos que otra app o servicio del sistema solicite actualizaciones de ubicación de forma activa, GnssTimeUpdateService no recibirá una actualización de ubicación y sugerirá una hora del GNSS.

Prueba

Conjunto de pruebas de compatibilidad (CTS)

Se proporciona una prueba de CTS para verificar que haya una hora proporcionada por el GNSS disponible. Para obtener más información, consulta LocationShellCommand.java.

Pruebas de unidades

Consulta las pruebas de unidades básicas en el siguiente archivo:

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

Pruebas manuales

Para probar esta función, se agregaron comandos nuevos a LocationShellCommand.java. Usa estos comandos para agregar proveedores de prueba con los que puedes especificar una ubicación y la hora de GNSS asociada. GnssTimeUpdateService escucha estas actualizaciones de ubicación y hace sugerencias de forma periódica.

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 hora externas

Las sugerencias de hora externas son otra forma de proporcionar sugerencias de hora automáticas a Android. Estas nuevas opciones te permiten proporcionar sugerencias de hora completamente personalizadas a Android, que pueden provenir de varias ECU que, a su vez, pueden usar una combinación de un reloj en tiempo real, GNSS, NITZ o cualquier otra fuente de hora.

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

  • Propiedades de VHAL. Se proporciona una nueva propiedad VHAL llamada EPOCH_TIME. Esta propiedad indica la cantidad de milisegundos transcurridos desde el 1/1/1970 (UTC). Su valor se puede pasar al TimeManager de Android para sugerir una nueva hora del sistema. En la siguiente implementación de referencia, se proporciona una implementación de ejemplo de VHAL que actualiza esta propiedad.
  • APIs del sistema Hay un nuevo método llamado suggestExternalTime() disponible en TimeManager para proporcionarle al sistema una sugerencia de hora externa. Si el sistema está configurado para tener en cuenta las sugerencias de hora externas (con config_autoTimeSourcesPriority en el archivo de configuración), la marca de tiempo que se pasa a este método se usa para establecer la hora del sistema, si no hay sugerencias de hora de prioridad más alta disponibles.

Puedes implementar una solución de hora externa como se describe a continuación:

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

    De esta manera, se le indica a Android que le dé la prioridad más alta a las sugerencias de hora externas cuando configure el reloj del sistema. El hardware del vehículo escribe una sugerencia de marca de tiempo en la nueva propiedad VHAL EPOCH_TIME.

  2. Una app 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.