Automatyczne wykrywanie czasu

Automatyczne wykrywanie czasu otrzymuje sugestie dotyczące czasu z różnych źródeł, wybiera najlepszą opcję, a następnie ustawia zegar systemowy w Androidzie. W poprzednich wersjach Androida były 2 sposoby ustawiania daty i godziny: ręcznie przez użytkownika lub za pomocą automatycznego wykrywania czasu. Można było wybrać jedną z tych opcji:

  • telephony używa sygnałów telefonicznych NITZ (Network Identity and Time Zone).
  • network używa serwerów czasu NTP (Network Time Protocol).

Każda z tych opcji wymaga połączenia 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ć wbudowanej funkcji telefonicznej. Dlatego czas globalnych systemów nawigacji satelitarnej (GNSS) jest udostępniany jako źródło czasu systemowego, z którego możesz korzystać, gdy nie ma połączenia z siecią.

Ta nadchodząca wersja Androida zawiera 2 dodatkowe opcje automatycznego wykrywania i ustawiania czasu:

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

Włączanie automatycznego wykrywania czasu

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

Rysunek 1. Wybierz Automatyczna data i godzina

Konfigurowanie źródeł czasu

Aby określić, które źródła czasu mają być uwzględniane w automatycznym wykrywaniu czasu, oraz priorytet, z jakim te źródła czasu mają być brane pod uwagę, musisz zmodyfikować plik konfiguracji 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 w automatycznym wykrywaniu czasu są uwzględniane źródła telephony i network, a sugestie dotyczące czasu z telephony mają wyższy priorytet niż sugestie dotyczące czasu z network.

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

Dolna granica czasu

Android 12 wprowadza nową dolną granicę czasu, która będzie używana podczas sprawdzania poprawności sugestii dotyczących czasu. Wcześniej automatyczne wykrywanie czasu nie sprawdzało poprawności sugerowanego przychodzącego czasu UTC. Dzięki tej funkcji czasy, które upłynęły przed dolną granicą, są odrzucane.

Wartość dolnej granicy jest określana na podstawie daty pochodzącej ze znacznika czasu kompilacji. Działa to na zasadzie, że prawidłowy czas nie może wystąpić przed utworzeniem obrazu systemu. Android nie wymusza górnej granicy.

Sugestie dotyczące czasu GNSS

Źródło czasu gnss jest nowością w Androidzie 12 i jest dostarczane przez sygnały GPS. Jest to wiarygodne źródło czasu, gdy źródła telephony i network są niedostępne. Ta opcja jest dodawana do nowej usługi GnssTimeUpdateService w SystemServer, która pasywnie nasłuchuje aktualizacji lokalizacji. Gdy zostanie odebrana prawidłowa lokalizacja, usługa GnssTimeUpdateService wysyła sugestię do usługi TimeDetectorService, która następnie określa, czy należy zaktualizować zegar systemowy.

Domyślnie źródło czasu gnss jest wyłączone w AOSP, 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ść dla config_enableGnssTimeUpdateService musi być ustawiona na true.
  2. Zaktualizuj config_autoTimeSourcesPriority. gnss należy dodać do listy elementów config_autoTimeSourcesPriority. Pozycja gnss na liście priorytetów określa priorytet sugestii GNSS w stosunku do wartości z innych źródeł.

Wpływ na zużycie energii

Usługa GnssTimeUpdateService pasywnie nasłuchuje aktualizacji lokalizacji, co oznacza, że nigdy aktywnie nie włącza GPS, aby zużywać dodatkową energię. Dzięki temu zużycie energii, gdy źródło GNSS jest włączone, jest znikome. Oznacza to również, że jeśli inna aplikacja lub usługa w systemie nie zażąda aktywnie aktualizacji lokalizacji, usługa GnssTimeUpdateService nie otrzyma aktualizacji lokalizacji i nie zasugeruje czasu GNSS.

Testowanie

Pakiet testów zgodności (CTS)

Dostępny jest test CTS, który sprawdza, czy dostępny jest czas podany przez GNSS. Więcej informacji znajdziesz w pliku LocationShellCommand.java.

Testy jednostkowe

Podstawowe testy jednostkowe znajdziesz w tym 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 z nią czas GNSS. Usługa GnssTimeUpdateService nasłuchuje tych aktualizacji lokalizacji i okresowo wysyła sugestie.

Uwaga: interfejs tych poleceń może się zmieniać w kolejnych wersjach.

# 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 dotyczące czasu to kolejny sposób na automatyczne sugerowanie czasu w Androidzie. Te nowe opcje umożliwiają dostarczanie do Androida w pełni dostosowanych sugestii dotyczących czasu, które mogą pochodzić z różnych ECU, które z kolei mogą używać kombinacji zegara czasu rzeczywistego, GNSS, NITZ lub innego źródła czasu.

W Androidzie 12 dostępne są te sugestie, które można uznać za sugestie dotyczące czasu external:

  • Właściwości VHAL. Dostępna jest nowa właściwość VHAL o nazwie EPOCH_TIME. Ta właściwość oznacza liczbę milisekund, które upłynęły od 1 stycznia 1970 r. czasu UTC. Jej wartość można przekazać do Androida TimeManager, aby zasugerować nowy czas systemowy. Przykładowa implementacja VHAL która aktualizuje tę właściwość, jest dostępna na stronie implementacji referencyjnej.
  • Interfejsy API systemu. W usłudze TimeManager dostępna jest nowa metoda o nazwie suggestExternalTime() , która umożliwia przekazywanie do systemu zewnętrznej sugestii dotyczącej czasu. Jeśli system jest skonfigurowany tak, aby uwzględniać zewnętrzne sugestie dotyczące czasu (za pomocą config_autoTimeSourcesPriority w pliku konfiguracji), znacznik czasu przekazany do tej metody jest używany do ustawienia czasu systemowego, jeśli nie są dostępne sugestie dotyczące czasu o wyższym priorytecie.

Rozwiązanie dotyczące czasu zewnętrznego możesz zaimplementować w sposób opisany poniżej:

  1. Zaktualizuj plik konfiguracji 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>

    Dzięki temu Android będzie przyznawać zewnętrznym sugestiom dotyczącym czasu najwyższy priorytet podczas ustawiania zegara systemowego. Sprzęt w pojeździe zapisuje sugestię znacznika czasu w nowej EPOCH_TIME właściwości VHAL.

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