Automatische Zeiterkennung

Bei der automatischen Zeiterkennung werden Zeitvorschläge von verschiedenen Quellen empfangen, die beste Option ausgewählt und die Systemuhr in Android entsprechend eingestellt. Bei früheren Android-Releases gab es zwei Möglichkeiten, Datum und Uhrzeit festzulegen: entweder manuell pro Nutzer oder durch automatische Zeiterkennung. Dabei standen folgende Optionen zur Verfügung:

  • telephony verwendet Telefoniesignale für Netzwerkidentität und Zeitzone (Network Identity and Time Zone, NITZ).
  • network verwendet NTP-Zeitserver (Network Time Protocol).

Für jede Option sind Verbindungen zu externen Netzwerken erforderlich, die in Android Automotive nicht immer verfügbar sind. In einigen Ländern sind Autos beispielsweise möglicherweise nicht mit einer integrierten Telefonfunktion ausgestattet. Daher wird die Zeit von Global Satellite Navigation Systems (GNSS) als Systemzeitquelle bereitgestellt, die Sie verwenden können, wenn keine Netzwerkverbindung verfügbar ist.

Die nächste Android-Version bietet zwei weitere Optionen zur automatischen Erkennung und Einstellung der Uhrzeit:

  • gnss verwendet globale Satellitennavigationssysteme (GNSS).
  • external verwendet eine VHAL-Eigenschaft oder die System API.

Automatische Zeiterkennung aktivieren

Wenn Sie die automatische Zeiterkennung aktivieren möchten, wählen Sie Einstellungen > Datum und Uhrzeit > Datum und Uhrzeit automatisch einstellen aus:

Abbildung 1. Wählen Sie „Automat. Datum & Uhrzeit“ aus.

Zeitquellen konfigurieren

Wenn Sie angeben möchten, welche Zeitquellen in die automatische Zeiterkennung einbezogen werden sollen und mit welcher Priorität diese Zeitquellen berücksichtigt werden sollen, müssen Sie die Ressourcenkonfigurationsdatei des Geräts core/res/res/values/config.xml ändern:

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

In diesem Beispiel werden telephony und network bei der automatischen Zeiterkennung berücksichtigt und die Zeitvorschläge für telephony werden vor den Zeitvorschlägen für network priorisiert.

Im Allgemeinen werden Vorschläge von einer Quelle mit höherer Priorität ignoriert, wenn sie ungültig oder zu alt sind. Wenn der gültige Vorschlag mit der höchsten Priorität innerhalb weniger Sekunden mit der aktuellen Systemuhrzeit des Geräts übereinstimmt (der Standardwert ist zwei (2) Sekunden), wird die Uhrzeit nicht geändert.

Untere zeitliche Grenze

In Android 12 gibt es eine neue untere zeitliche Beschränkung, die bei der Validierung von Zeitvorschlägen verwendet werden kann. Vor dieser Funktion wurde die vorgeschlagene UTC-Zeit bei der automatischen Zeiterkennung nicht validiert. Bei dieser Funktion werden Zeiten, die vor dem Untergrenzwert vergehen, verworfen.

Der untere Grenzwert wird anhand eines Datums bestimmt, das aus dem Build-Zeitstempel abgeleitet wird. Dabei wird davon ausgegangen, dass eine gültige Zeit nicht vor dem Erstellen des System-Images auftreten kann. Android erzwingt keine Obergrenze.

GNSS-Zeitvorschläge

Die Zeitquelle gnss ist neu in Android 12 und wird über GPS-Signale bereitgestellt. Dies ist eine zuverlässige Quelle für Zeiten, in denen telephony und network nicht verfügbar sind. Diese Option wird der neuen GnssTimeUpdateService in SystemServer hinzugefügt, die passiv auf Standortaktualisierungen wartet. Wenn ein gültiger Standort empfangen wird, macht GnssTimeUpdateService einen Vorschlag an TimeDetectorService, der dann festlegt, ob die Systemuhr aktualisiert werden soll.

Standardmäßig ist die gnss-Zeitquelle in AOSP deaktiviert und muss daher von Partnern aktiviert werden:

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

So aktivieren Sie diese Funktion:

  1. config_enableGnssTimeUpdateService aktualisieren. Der Wert für config_enableGnssTimeUpdateService muss auf true festgelegt werden.
  2. config_autoTimeSourcesPriority aktualisieren. gnss muss der Artikelliste für config_autoTimeSourcesPriority hinzugefügt werden. Die Position von gnss in der Prioritätsliste bestimmt die Priorität, die GNSS-Vorschlägen im Vergleich zu Werten aus anderen Quellen eingeräumt wird.

Auswirkungen auf die Leistung

GnssTimeUpdateService liest Standortaktualisierungen passiv, d. h., das GPS wird nie aktiv eingeschaltet, um zusätzliche Energie zu verbrauchen. Daher ist der Stromverbrauch bei aktivierter GNSS-Quelle vernachlässigbar. Das bedeutet auch, dass GnssTimeUpdateService, sofern keine andere App oder ein anderer Dienst im System aktiv Standortaktualisierungen anfordert, keinen Standortaktualisierungen erhält und keine GNSS-Zeit vorschlägt.

Testen

Compatibility Test Suite (CTS)

Mit einem CTS-Test wird geprüft, ob eine von GNSS bereitgestellte Zeit verfügbar ist. Weitere Informationen finden Sie unter LocationShellCommand.java.

Einheitentests

Die grundlegenden Unittests finden Sie in der folgenden Datei:

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

Manuelle Tests

Zum Testen dieser Funktion wurden LocationShellCommand.java neue Befehle hinzugefügt. Mit diesen Befehlen können Sie Testanbieter hinzufügen, mit denen Sie einen Standort und die zugehörige GNSS-Zeit angeben können. GnssTimeUpdateService überwacht diese Standortaktualisierungen und macht in regelmäßigen Abständen Vorschläge.

Hinweis:Die Benutzeroberfläche für diese Befehle kann sich zwischen den Releases ändern.

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

Externe Zeitvorschläge

Externe Zeitvorschläge sind eine weitere Möglichkeit, Android automatische Zeitvorschläge zur Verfügung zu stellen. Mit diesen neuen Optionen können Sie Android vollständig personalisierte Zeitvorschläge zur Verfügung stellen, die von verschiedenen Steuergeräten stammen können, die wiederum eine Kombination aus Echtzeituhr, GNSS, NITZ oder einer anderen Zeitquelle verwenden können.

In Android 12 sind die folgenden Vorschläge als external Zeitvorschläge verfügbar:

  • VHAL-Attribute Es wird eine neue VHAL-Property namens EPOCH_TIME bereitgestellt. Diese Eigenschaft gibt die Anzahl der Millisekunden an, die seit dem 1. Januar 1970 (UTC) vergangen sind. Der Wert kann an die Android-TimeManager übergeben werden, um eine neue Systemzeit vorzuschlagen. Eine Beispielimplementierung von VHAL, mit der diese Eigenschaft aktualisiert wird, findest du in der Referenzimplementierung unten.
  • System-APIs In TimeManager ist eine neue Methode namens suggestExternalTime() verfügbar, mit der dem System ein externer Zeitvorschlag zur Verfügung gestellt werden kann. Wenn das System so konfiguriert ist, dass externe Zeitvorschläge berücksichtigt werden (config_autoTimeSourcesPriority in der Konfigurationsdatei), wird die Systemzeit mit dem an diese Methode übergebenen Zeitstempel festgelegt, wenn keine Zeitvorschläge mit höherer Priorität verfügbar sind.

Sie können eine externe Zeitlösung wie unten beschrieben implementieren:

  1. Aktualisieren Sie die Ressourcenkonfigurationsdatei (core/res/res/values/config.xml) und fügen Sie config_autoTimeSourcesPriority den Wert external hinzu:
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>

    Dadurch wird Android angewiesen, externen Zeitvorschlägen bei der Einstellung der Systemuhr die höchste Priorität zu geben. Die Hardware im Fahrzeug schreibt einen Zeitstempelvorschlag in die neue EPOCH_TIME-VHAL-Property.

  2. Eine vom Anbieter bereitgestellte App liest diese Property und ruft TimeManager.suggestExternal() auf. Android kann dann den angegebenen Zeitstempel als neuen Wert für die Systemuhr verwenden.