Automatyczne wykrywanie czasu

Automatyczne wykrywanie czasu otrzymuje propozycje czasu z różnych źródeł, wybiera najlepszą opcję, a następnie ustawia zegar systemowy na Androidzie. W poprzednich wersjach Androida można było ustawić datę i godzinę na 2 sposoby: ręcznie dla każdego użytkownika lub automatycznie. Wybierz jedną z tych opcji:

  • telephony używa sygnałów telefonii komórkowej dotyczących tożsamości sieci i strefy czasowej (NITZ).
  • network używa serwerów czasu zgodnych z protokołem NTP (Network Time Protocol).

Każda opcja 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 telefonu. Dlatego w przypadku braku połączenia z internetem jako źródło czasu systemowego służy globalny system nawigacji satelitarnej (GNSS).

W nadchodzącej wersji Androida dostępne są 2 kolejne 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 System API.

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

Konfigurowanie źródeł czasu

Aby określić, które źródła czasu uwzględnić w automatycznym wykrywaniu czasu, oraz priorytet, z jakim te źródła czasu powinny 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 telephony i network są brane pod uwagę podczas automatycznego wykrywania czasu, a sugestie dotyczące czasu telephony mają wyższy priorytet niż sugestie dotyczące czasu 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 ponadto propozycja z najwyższym priorytetem zgadza się z aktualnym 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 udostępnia nowy krótszy limit czasu do użycia podczas sprawdzania sugestii dotyczących czasu. Przed wprowadzeniem tej funkcji automatyczne wykrywanie czasu nie sprawdzało sugerowanego czasu UTC. Dzięki tej funkcji czasy, które upływają przed dolnym ograniczeniem, są odrzucane.

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

Sugerowane czasy 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 opcje telephonynetwork są niedostępne. Ta opcja została dodana do nowego procesu GnssTimeUpdateService w SystemServer, który pasywnie odbiera aktualizacje lokalizacji. Gdy otrzymana zostanie prawidłowa lokalizacja, GnssTimeUpdateService przekaże sugestię do TimeDetectorService, która zdecyduje, czy zegar systemowy powinien zostać zaktualizowany.

Domyślnie źródło czasu gnss nie jest włą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ść parametru config_enableGnssTimeUpdateService musi wynosić true.
  2. Zaktualizuj config_autoTimeSourcesPriority. Do listy elementów w jednostce organizacyjnej config_autoTimeSourcesPriority musisz dodać element gnss. Pozycja gnss na liście priorytetów określa priorytet przypisany do sugestii GNSS w stosunku do wartości z innych źródeł.

Wpływ na moc

GnssTimeUpdateService pasywnie odbiera informacje o lokalizacji, co oznacza, że nigdy nie włącza aktywnie GPS-a, aby zużywać dodatkowej energii. W rezultacie zużycie energii, gdy włączone jest źródło GNSS, jest znikome. Oznacza to też, że jeśli inna aplikacja lub usługa w systemie nie prosi aktywnie o aktualizacje lokalizacji, GnssTimeUpdateService nie otrzyma aktualizacji lokalizacji ani nie zaproponuje czasu GNSS.

Testowanie

Compatibility Test Suite (CTS)

Test CTS służy do sprawdzenia, czy czas dostarczany przez GNSS jest dostępny. Więcej informacji: 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 LocationShellCommand.java dodaliśmy nowe polecenia. Użyj tych poleceń, aby dodać dostawców testowych, za pomocą których możesz określić lokalizację i powiązany z nią czas GNSS. GnssTimeUpdateService słucha tych aktualizacji lokalizacji i okresowo przedstawia 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>

Sugerowane terminy zewnętrzne

Zewnętrzne sugestie dotyczące czasu to kolejny sposób na automatyczne wyświetlanie sugestii dotyczących czasu na Androidzie. Te nowe opcje umożliwiają udostępnianie Androidowi w pełni spersonalizowanych sugestii dotyczących czasu, które mogą pochodzić z różnych sterowników ECU, które z kolei mogą korzystać z kombinacji zegara w czasie rzeczywistym, GNSS, NITZ lub innego źródła czasu.

W Androidzie 12 dostępne są następujące sugestie, które możesz wziąć pod uwagę jako external sugestie dotyczące czasu:

  • 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. w czasie UTC. Jego wartość może zostać przekazana do Androida TimeManager, aby zasugerować nowy czas systemowy. Przykładowa implementacja VHAL, która aktualizuje tę właściwość, jest dostępna w implementacji referencyjnej poniżej.
  • Interfejsy API systemu. W TimeManagerze dostępna jest nowa metoda o nazwie suggestExternalTime(), która umożliwia systemowi podanie zewnętrznej propozycji czasu. Jeśli system jest skonfigurowany tak, aby uwzględniać zewnętrzne sugestie dotyczące czasu (za pomocą parametru config_autoTimeSourcesPriority w pliku konfiguracji), sygnatura czasowa przekazana do tej metody jest używana do ustawiania czasu systemowego, jeśli nie ma dostępnych sugestii dotyczących czasu o wyższym priorytecie.

Możesz wdrożyć zewnętrzne rozwiązanie dotyczące czasu w ten sposób:

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

    W ten sposób Android będzie przypisywać zewnętrznym sugestiom dotyczące czasu najwyższy priorytet podczas ustawiania zegara systemowego. Sprzęt w pojazdach zapisuje propozycję sygnatury czasowej w nowej EPOCH_TIME usłudze VHAL.

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