Détection automatique de l'heure

La détection automatique de l'heure reçoit des suggestions d'heure provenant de diverses sources, sélectionne la meilleure option, puis règle l'horloge système d'Android en conséquence. Les versions précédentes d'Android proposaient deux manières de définir la date et l'heure, soit manuellement par utilisateur, soit par détection automatique de l'heure, et définies par l'une de ces options :

  • telephony utilise les signaux de téléphonie Network Identity and Time Zone (NITZ).
  • network utilise des serveurs de temps NTP (Network Time Protocol).

Chaque option nécessite des connexions à des réseaux externes, qui ne sont pas toujours disponibles dans Android Automotive. Par exemple, dans certains pays, certaines voitures peuvent ne pas disposer de téléphonie intégrée. Par conséquent, l'heure du système mondial de navigation par satellite (GNSS) est fournie comme source d'heure système que vous pouvez utiliser lorsque la connectivité réseau n'est pas disponible.

Cette prochaine version d'Android propose deux options supplémentaires pour détecter et régler automatiquement l'heure :

  • gnss utilise les systèmes mondiaux de navigation par satellite (GNSS).
  • external utilise une propriété VHAL ou l'API système.

Activer la détection automatique de l'heure

Pour activer la détection automatique de l'heure, assurez-vous de sélectionner Paramètres > Date et heure > Date et heure automatiques :

Figure 1. Sélectionnez Date et heure automatiques

Configurer les sources de temps

Pour spécifier les sources de temps à inclure dans la détection automatique de l'heure, ainsi que la priorité dans laquelle ces sources de temps doivent être prises en compte, vous devez modifier le fichier de configuration des ressources de l'appareil, 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>

Dans cet exemple, telephony et network sont pris en compte dans la détection automatique de l'heure et les suggestions d'heure telephony ont la priorité sur les suggestions d'heure network .

De manière générale, les suggestions provenant d'une source de priorité plus élevée sont ignorées si la suggestion n'est pas valide ou si elle est trop ancienne. De plus, si la suggestion valide de priorité la plus élevée correspond à l'heure actuelle de l'horloge système de l'appareil à quelques secondes près (la valeur par défaut est de deux (2) secondes), l'heure ne sera pas modifiée.

Limite de temps inférieure

Android 12 fournit un nouveau temps inférieur à utiliser lors de la validation des suggestions de temps. Avant cette fonctionnalité, la détection automatique de l'heure ne validait pas l'heure UTC entrante suggérée. Avec cette fonctionnalité, les temps écoulés avant la limite inférieure sont ignorés.

La valeur limite inférieure est déterminée à partir d'une date dérivée de l'horodatage de construction. Cela fonctionne sur le principe qu'une heure valide ne peut pas se produire avant la création de l'image système. Android n'impose pas de limite supérieure.

Suggestions d'heure GNSS

La source horaire gnss est nouvelle sur Android 12 et est fournie par les signaux GPS. Il s'agit d'une source fiable pour connaître les moments où telephony et network ne sont pas disponibles. Cette option est ajoutée au nouveau GnssTimeUpdateService dans SystemServer qui écoute passivement les mises à jour d'emplacement. Lorsqu'un emplacement valide est reçu, GnssTimeUpdateService fait une suggestion à TimeDetectorService , qui détermine ensuite si l'horloge système doit être mise à jour.

Par défaut, la source horaire gnss n'est pas activée dans AOSP et doit donc être activée par les partenaires :

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

Pour activer cette fonctionnalité :

  1. Mettez à jour config_enableGnssTimeUpdateService . La valeur de config_enableGnssTimeUpdateService doit être définie sur true .
  2. Mettez à jour config_autoTimeSourcesPriority . gnss doit être ajouté à la liste d'éléments pour config_autoTimeSourcesPriority . La position du gnss dans la liste des priorités détermine la priorité accordée aux suggestions GNSS, par rapport aux valeurs provenant d'autres sources.

Impact sur le pouvoir

GnssTimeUpdateService écoute passivement les mises à jour de localisation, ce qui signifie qu'il n'active jamais activement le GPS pour consommer de l'énergie supplémentaire. En conséquence, la puissance consommée lorsque la source GNSS est activée est négligeable. Cela signifie également qu'à moins qu'une autre application ou un autre service du système ne demande activement des mises à jour de localisation, GnssTimeUpdateService ne reçoit pas de mise à jour de localisation et ne suggère pas d'heure GNSS.

Essai

Suite de tests de compatibilité (CTS)

Un test CTS est fourni pour vérifier qu'une heure fournie par GNSS est disponible. Pour plus de détails, consultez LocationShellCommand.java .

Tests unitaires

Voir les tests unitaires de base dans le fichier suivant :

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

Tests manuels

Pour tester cette fonctionnalité, de nouvelles commandes ont été ajoutées à LocationShellCommand.java . Utilisez ces commandes pour ajouter des fournisseurs de tests avec lesquels vous pouvez spécifier un emplacement et l'heure GNSS associée. GnssTimeUpdateService écoute ces mises à jour de localisation et fait périodiquement des suggestions.

Remarque : L'interface de ces commandes peut changer d'une version à l'autre.

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

Suggestions d'heures externes

Les suggestions d'heure externes sont un autre moyen de fournir des suggestions d'heure automatiques à Android. Ces nouvelles options vous permettent de fournir à Android des suggestions d'heure entièrement personnalisées, qui peuvent provenir de divers calculateurs qui, à leur tour, peuvent utiliser une combinaison d'horloge en temps réel, GNSS, NITZ ou toute autre source de temps.

Les suggestions suivantes sont disponibles dans Android 12 et peuvent être considérées comme des suggestions d'heure external :

  • Propriétés VHAL. Une nouvelle propriété VHAL nommée EPOCH_TIME est fournie. Cette propriété indique le nombre de millisecondes écoulées depuis le 01/01/1970 UTC. Sa valeur peut être transmise à Android TimeManager pour suggérer une nouvelle heure système. Un exemple d’implémentation VHAL qui met à jour cette propriété est fourni dans l’ implémentation de référence ci-dessous.
  • API système. Une nouvelle méthode appelée suggestExternalTime() est disponible dans TimeManager pour fournir au système une suggestion d'heure externe. Si le système est configuré pour prendre en compte les suggestions d'heure externes (en utilisant config_autoTimeSourcesPriority dans le fichier de configuration), l'horodatage transmis à cette méthode est utilisé pour définir l'heure du système, si aucune suggestion d'heure de priorité plus élevée n'est disponible.

Vous pouvez implémenter une solution de temps externe comme décrit ci-dessous :

  1. Mettez à jour le fichier de configuration des ressources ( core/res/res/values/config.xml ), puis ajoutez la valeur external à config_autoTimeSourcesPriority :
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>
    

    Cela demande à Android d'accorder la priorité la plus élevée aux suggestions d'heure externes lors du réglage de l'horloge système. Le matériel du véhicule écrit une suggestion d'horodatage dans la nouvelle propriété EPOCH_TIME VHAL .

  2. Une application fournie par le fournisseur lit cette propriété et appelle TimeManager.suggestExternal() . Android peut alors utiliser l'horodatage fourni comme nouvelle valeur d'horloge système.