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:
- Actualiza
config_enableGnssTimeUpdateService
. El valor deconfig_enableGnssTimeUpdateService
se debe establecer entrue
. - Actualiza
config_autoTimeSourcesPriority
. Se debe agregargnss
a la lista de elementos deconfig_autoTimeSourcesPriority
. La posición degnss
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 alTimeManager
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 (conconfig_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:
- Actualiza el archivo de configuración de recursos (
core/res/res/values/config.xml
) y, luego, agrega el valorexternal
aconfig_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
. - 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.