Automatische Zeiterkennung

Bei der automatischen Uhrzeiterkennung werden Zeitvorschläge aus verschiedenen Quellen abgerufen, die beste Option ausgewählt und dann die Systemuhr in Android entsprechend eingestellt. In früheren Android-Versionen gab es zwei Möglichkeiten, Datum und Uhrzeit festzulegen: entweder manuell pro Nutzer oder über die automatische Uhrzeiterkennung. Die Uhrzeit wurde dann über eine der folgenden Optionen festgelegt:

  • telephony verwendet NITZ-Telefonsignale (Network Identity and Time Zone).
  • network verwendet NTP-Zeitserver (Network Time Protocol).

Für beide Optionen sind Verbindungen zu externen Netzwerken erforderlich, die in Android Automotive nicht immer verfügbar sind. In einigen Ländern haben beispielsweise einige Autos keine integrierte Telefonfunktion. Daher wird die Zeit des globalen Satellitennavigationssystems (GNSS) als Quelle für die Systemzeit bereitgestellt, die verwendet werden kann, wenn keine Netzwerkverbindung besteht.

In dieser kommenden Android-Version gibt es zwei weitere Optionen zum automatischen Erkennen und Festlegen der Uhrzeit:

  • gnss verwendet das globale Satelliten navigationssystem (GNSS).
  • external verwendet eine VHAL-Property oder die System API.

Automatische Uhrzeiterkennung aktivieren

Wenn Sie die automatische Uhrzeiterkennung aktivieren möchten, wählen Sie Einstellungen > Datum und Uhrzeit > Autom. Datum/Uhrzeit aus:

Abbildung 1. „Autom. Datum/Uhrzeit“ auswählen

Zeitquellen konfigurieren

Wenn Sie angeben möchten, welche Zeitquellen in die automatische Uhrzeiterkennung einbezogen werden sollen und in welcher Priorität diese Zeitquellen berücksichtigt werden sollen, müssen Sie die Ressourcenkonfigurationsdatei des Geräts ändern: 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>

In diesem Beispiel werden telephony und network bei der automatischen Uhrzeiterkennung berücksichtigt und Zeitvorschläge von telephony haben eine höhere Priorität als Zeitvorschläge von network.

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

Untere Zeitgrenze

Android 12 bietet eine neue untere Zeitgrenze , die bei der Validierung von Zeitvorschlägen verwendet werden kann. Vor dieser Funktion wurde die vorgeschlagene eingehende UTC-Zeit bei der automatischen Uhrzeiterkennung nicht validiert. Mit dieser Funktion werden Zeiten, die vor der unteren Grenze liegen, verworfen.

Der Wert für die untere Grenze wird aus einem Datum abgeleitet, das aus dem Build-Zeitstempel stammt. Das funktioniert nach dem Prinzip, dass eine gültige Zeit nicht vor dem Erstellen des System-Images liegen 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 Zeitquelle, wenn telephony und network nicht verfügbar sind. Diese Option wird dem neuen GnssTimeUpdateService in SystemServer hinzugefügt, der 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 Zeitquelle gnss in AOSP nicht aktiviert 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. Aktualisieren Sie config_enableGnssTimeUpdateService. Der Wert für config_enableGnssTimeUpdateService muss auf true gesetzt sein.
  2. Aktualisieren Sie config_autoTimeSourcesPriority. gnss muss der Elementliste 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 zugewiesen wird.

Auswirkungen auf den Stromverbrauch

GnssTimeUpdateService wartet passiv auf Standortaktualisierungen. Das bedeutet, dass GPS nie aktiv eingeschaltet wird, um zusätzlichen Strom zu verbrauchen. Daher ist der Stromverbrauch bei aktivierter GNSS-Quelle vernachlässigbar. Das bedeutet auch, dass GnssTimeUpdateService keine Standortaktualisierung erhält und keine GNSS-Zeit vorschlägt, es sei denn, eine andere App oder ein anderer Dienst im System fordert aktiv Standortaktualisierungen an.

Test

Compatibility Test Suite (CTS)

Es gibt einen CTS-Test, mit dem geprüft werden kann, ob eine von GNSS bereitgestellte Zeit verfügbar ist. Weitere Informationen finden Sie unter LocationShellCommand.java.

Einheitentests

Die grundlegenden Einheitentests 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 wartet auf diese Standortaktualisierungen und macht regelmäßig Vorschläge.

Hinweis:Die Schnittstelle für diese Befehle kann sich zwischen den Versionen ä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 zu senden. Mit dieser neuen Option können Sie Android vollständig benutzerdefinierte Zeitvorschläge senden, die von verschiedenen Steuergeräten stammen können. Diese können wiederum eine Kombination aus einer Echtzeituhr, GNSS, NITZ oder einer anderen Zeitquelle verwenden.

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

  • VHAL-Properties Es gibt eine neue VHAL-Property namens EPOCH_TIME ist vorhanden. Diese Property gibt die Anzahl der Millisekunden an, die seit dem 1.1.1970 UTC vergangen sind. Ihr Wert kann an das Android TimeManager übergeben werden, um eine neue Systemzeit vorzuschlagen. Eine Beispielimplementierung von VHAL , die diese Property aktualisiert, finden Sie auf der Seite mit der Referenzimplementierung.
  • System APIs In TimeManager gibt es eine neue Methode namens suggestExternalTime() , mit der dem System ein externer Zeitvorschlag gesendet werden kann. Wenn das System so konfiguriert ist, dass externe Zeitvorschläge berücksichtigt werden (mit config_autoTimeSourcesPriority in der Konfigurationsdatei), wird der an diese Methode übergebene Zeitstempel verwendet, um die Systemzeit festzulegen, 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 dann den Wert external zu config_autoTimeSourcesPriority hinzu:
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>

    Dadurch wird Android angewiesen, externen Zeitvorschlägen die höchste Priorität zu geben, wenn die Systemuhr eingestellt wird. 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.