GNSS-Zeiterkennung

In Android 12 und höher kann Android optional ein Global Navigation Satellite System (GNSS) verwenden, um dem time_detector-Dienst Unix-Epochenzeiten vorzuschlagen. Diese Funktion ist in AOSP nicht standardmäßig aktiviert.

Wenn die GNSS-Zeiterkennung aktiviert ist, empfängt gnss_time_update_service passiv Standortaktualisierungen von GNSS-Quellen und sendet GNSS-Vorschläge an den time_detector-Dienst. Der time_detector-Dienst entscheidet dann, ob die Systemuhr entsprechend dem Vorschlag aktualisiert werden soll.

Auswirkungen auf den Stromverbrauch

AOSP gnss_time_update_service empfängt Standortaktualisierungen passiv. Das bedeutet, dass der Dienst das GPS nie aktiv einschaltet oder zusätzlichen Strom verbraucht. Das bedeutet auch, dass gnss_time_update_service kein Standortupdate erhält und keine GNSS-Zeit vorschlägt, wenn nicht aktiv Standortupdates von einer anderen App oder einem anderen Dienst im System angefordert werden.

Implementierung

Damit die GNSS-Zeiterkennung aktiviert werden kann, müssen Gerätehersteller gnss_time_update_service explizit auf dem Systemserver aktivieren.

Sowohl die config_enableGnssTimeUpdateService- als auch die config_autoTimeSourcesPriority-Werte in der Datei core/res/res/values/config.xml müssen aktualisiert werden, damit diese Funktion aktiviert werden kann. Legen Sie den Wert für config_enableGnssTimeUpdateService auf true fest und fügen Sie gnss der Artikelliste für config_autoTimeSourcesPriority hinzu. Die Position von gnss in der Prioritätsliste bestimmt die Priorität, die GNSS-Vorschlägen im Vergleich zu Vorschlägen aus anderen Quellen zugewiesen wird.

Das Folgende ist ein Beispiel für eine core/res/res/values/config.xml-Datei, in der die GNSS-Zeiterkennung aktiviert ist und gnss nach network und telephony an dritter Stelle in der Prioritätsliste steht:

<!-- 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>network</item>
        <item>telephony</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>

Fehler beheben und testen

Verwenden Sie adb shell cmd location-Befehle, um die GNSS-Zeiterkennung zu testen. Mit diesen Befehlen können Sie Teststandortanbieter hinzufügen, bei denen Sie einen Standort und die zugehörige GNSS-Zeit angeben können. gnss_time_update_service hört auf diese Standortaktualisierungen und macht regelmäßig Vorschläge.

Im Folgenden finden Sie Beispiele für adb shell cmd location-Befehle:

  • Aktivieren Sie die Standorteinstellungen für den Vordergrundnutzer (in der Regel Nutzer 10 in Fahrzeugen). Wenn du das Gerät gerade erst geflasht hast, kannst du das im Einrichtungsassistenten tun.

    adb shell cmd location set-location-enabled true --user 10
  • GPS-Testanbieter hinzufügen (schlägt in der Regel beim ersten Mal fehl und löst eine Sicherheitsausnahme mit android from <SOME_UID> not allowed to perform MOCK_LOCATION aus)

    adb shell cmd location providers add-test-provider gps
  • Berechtigung für simulierte Standorte für die vorherige UID aktivieren

    adb shell appops set UID_PRINTED_IN_PREVIOUS_ERROR android:mock_location allow
  • GPS-Testanbieter hinzufügen (sollte ohne Fehler funktionieren)

    adb shell cmd location providers set-test-provider-enabled gps true
  • GPS-Testanbieter aktivieren

    adb shell cmd location providers set-test-provider-enabled gps true
  • Standort mit Zeit festlegen (die Zeit darf nicht niedriger sein als das durch die Untergrenze festgelegte Limit)

    adb shell cmd location providers set-test-provider-location gps --location LATITUDE,LONGITUDE --time TIME