Automatyczne wykrywanie czasu

Automatyczne wykrywanie czasu otrzymuje sugestie dotyczące czasu z różnych źródeł, wybiera najlepszą opcję, a następnie ustawia odpowiednio zegar systemowy w Androidzie. Poprzednie wersje Androida zapewniały dwa sposoby ustawiania daty i godziny — ustawiane ręcznie dla użytkownika lub poprzez automatyczne wykrywanie czasu i ustawiane za pomocą jednej z następujących opcji:

  • telephony wykorzystuje sygnały telefoniczne identyfikujące tożsamość sieciową i strefę czasową (NITZ).
  • network korzysta z serwerów czasu protokołu Network Time Protocol (NTP).

Każda opcja wymaga połączeń z sieciami zewnętrznymi, które nie zawsze są dostępne w Android Automotive. Na przykład w niektórych krajach niektóre samochody mogą nie mieć wbudowanego telefonu. Dlatego czas globalnego systemu nawigacji satelitarnej (GNSS) jest źródłem czasu systemowego, z którego można korzystać, gdy łączność sieciowa jest niedostępna.

W nadchodzącej wersji Androida dostępne są jeszcze dwie opcje automatycznego wykrywania i ustawiania czasu:

  • gnss korzysta z globalnych systemów nawigacji satelitarnej (GNSS).
  • external używa właściwości VHAL lub interfejsu API systemu.

Włącz automatyczne wykrywanie czasu

Aby włączyć automatyczne wykrywanie czasu, wybierz Ustawienia > Data i godzina > Automatyczna data i godzina :

Rysunek 1. Wybierz opcję Automatyczna data i godzina

Skonfiguruj źródła czasu

Aby określić, które źródła czasu mają być uwzględnione w automatycznym wykrywaniu czasu oraz jaki priorytet mają te źródła czasu uwzględniać, należy zmodyfikować plik konfiguracyjny zasobów urządzenia, 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>

W tym przykładzie telephony i network są uwzględniane podczas automatycznego wykrywania czasu, a sugestie czasu telephony są traktowane priorytetowo przed sugestiami czasu network .

Ogólnie rzecz biorąc, sugestie ze źródła o wyższym priorytecie są ignorowane, jeśli są nieprawidłowe lub są zbyt stare. Ponadto, jeśli prawidłowa sugestia o najwyższym priorytecie odpowiada aktualnemu czasowi zegara systemowego urządzenia z dokładnością do kilku sekund (wartość domyślna to dwie (2) sekundy), czas nie zostanie zmieniony.

Niższy limit czasowy

W systemie Android 12 dostępny jest nowy , niższy czas, który będzie używany podczas sprawdzania sugestii dotyczących czasu. Przed tą funkcją automatyczne wykrywanie czasu nie sprawdzało sugerowanego przychodzącego czasu UTC. Dzięki tej funkcji czasy, które upłynęły przed dolną granicą, są odrzucane.

Dolna wartość graniczna jest określana na podstawie daty pochodzącej ze sygnatury czasowej kompilacji. Działa to na zasadzie, że nie może upłynąć ważny czas przed zbudowaniem obrazu systemu. Android nie wymusza górnej granicy.

Sugestie czasu GNSS

Źródło czasu gnss jest nowością w systemie Android 12 i jest dostarczane przez sygnały GPS. Jest to niezawodne źródło czasu, gdy telephony i network nie są dostępne. Ta opcja została dodana do nowej GnssTimeUpdateService na serwerze SystemServer, która pasywnie nasłuchuje aktualizacji lokalizacji. Po odebraniu prawidłowej lokalizacji GnssTimeUpdateService wysyła sugestię do TimeDetectorService , która następnie określa, czy należy zaktualizować zegar systemowy.

Domyślnie źródło czasu gnss nie jest włączone w AOSP i dlatego musi zostać włączone przez partnerów:

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

Aby włączyć tę funkcję:

  1. Zaktualizuj config_enableGnssTimeUpdateService . Wartość config_enableGnssTimeUpdateService musi być ustawiona na true .
  2. Zaktualizuj config_autoTimeSourcesPriority . gnss należy dodać do listy pozycji dla config_autoTimeSourcesPriority . Pozycja gnss na liście priorytetów określa priorytet nadawany sugestiom GNSS w stosunku do wartości z innych źródeł.

Wpływ na moc

GnssTimeUpdateService biernie nasłuchuje aktualizacji lokalizacji, co oznacza, że ​​nigdy aktywnie nie włącza GPS w celu zużycia dodatkowej energii. W rezultacie pobór mocy przy włączonym źródle GNSS jest znikomy. Oznacza to również, że jeśli inna aplikacja lub usługa w systemie aktywnie nie zażąda aktualizacji lokalizacji, GnssTimeUpdateService nie otrzyma aktualizacji lokalizacji i nie zasugeruje czasu GNSS.

Testowanie

Zestaw testów zgodności (CTS)

Test CTS służy do sprawdzenia, czy dostępny jest czas podany przez GNSS. Aby uzyskać szczegółowe informacje, zobacz LocationShellCommand.java .

Testy jednostkowe

Zobacz podstawowe testy jednostkowe w następującym pliku:

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

Testy ręczne

Aby przetestować tę funkcję, do pliku LocationShellCommand.java dodano nowe polecenia. Użyj tych poleceń, aby dodać dostawców testów, za pomocą których możesz określić lokalizację i powiązany czas GNSS. GnssTimeUpdateService nasłuchuje aktualizacji lokalizacji i okresowo przedstawia sugestie.

Uwaga: interfejs tych poleceń może się zmieniać w zależności od wersji.

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

Sugestie dotyczące czasu zewnętrznego

Zewnętrzne sugestie czasu to kolejny sposób na zapewnienie automatycznych sugestii czasu dla Androida. Te nowe opcje umożliwiają dostarczanie do Androida całkowicie spersonalizowanych sugestii czasu, które mogą pochodzić z różnych ECU, które z kolei mogą korzystać z kombinacji zegara czasu rzeczywistego, GNSS, NITZ lub dowolnego innego źródła czasu.

Poniższe sugestie są dostępne w systemie Android 12 i można je uwzględnić jako sugestie dotyczące czasu external :

  • Właściwości VHALA. Dodano nową właściwość VHAL o nazwie EPOCH_TIME . Ta właściwość oznacza liczbę milisekund, które upłynęły od 1/1/1970 UTC. Jego wartość można przekazać do menedżera czasu Android TimeManager , aby zasugerować nowy czas systemowy. Przykładową implementację VHAL, która aktualizuje tę właściwość, przedstawiono w poniższej implementacji referencyjnej .
  • Interfejsy API systemu. W TimeManager dostępna jest nowa metoda o nazwie suggestExternalTime() , która zapewnia systemowi zewnętrzną sugestię czasu. Jeśli system jest skonfigurowany tak, aby uwzględniał zewnętrzne sugestie czasu (przy użyciu config_autoTimeSourcesPriority w pliku konfiguracyjnym), znacznik czasu przekazany tej metodzie służy do ustawienia czasu systemowego, jeśli nie są dostępne sugestie czasu o wyższym priorytecie.

Możesz wdrożyć zewnętrzne rozwiązanie czasowe, jak opisano poniżej:

  1. Zaktualizuj plik konfiguracyjny zasobów ( core/res/res/values/config.xml ), a następnie dodaj wartość external do config_autoTimeSourcesPriority :
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>
    

    Spowoduje to, że Android nada sugestiom czasu zewnętrznego najwyższy priorytet podczas ustawiania zegara systemowego. Sprzęt w pojeździe zapisuje sugestię znacznika czasu do nowej właściwości VHAL EPOCH_TIME .

  2. Aplikacja dostarczona przez dostawcę odczytuje tę właściwość i wywołuje funkcję TimeManager.suggestExternal() . Android może następnie użyć podanego znacznika czasu jako nowej wartości zegara systemowego.