Otomatik zaman algılama

Otomatik saat algılama, çeşitli kaynaklardan saat önerileri alır, en iyi seçeneği belirler ve ardından Android'deki sistem saatini eşleşecek şekilde ayarlar. Önceki Android sürümlerinde, tarih ve saati ayarlamak için iki yöntem sunuluyordu: kullanıcı başına manuel ayarlama veya otomatik saat algılama ve aşağıdaki seçeneklerden biri:

  • telephony, Network Identity ve Time Zone (NITZ) telefon sinyallerini kullanır.
  • network, Ağ Saati Protokolü (NTP) zaman sunucularını kullanır.

Her seçenek, harici ağlara bağlantı gerektirir. Bu bağlantılar Android Automotive'te her zaman kullanılamaz. Örneğin, bazı ülkelerde bazı araçlarda yerleşik telefon bulunmayabilir. Bu nedenle, ağ bağlantısı olmadığında kullanabileceğiniz sistem saati kaynağı olarak Küresel Uydu Navigasyon Sistemleri (GNSS) zamanı sağlanır.

Yakında kullanıma sunulacak bu Android sürümünde, saati otomatik olarak algılayıp ayarlamak için iki seçenek daha sunulmaktadır:

  • gnss, küresel uydu navigasyon sistemlerini (GNSS) kullanır.
  • external, VHAL mülkü veya Sistem API'sini kullanıyor.

Otomatik zaman algılamayı etkinleştirme

Otomatik saat algılamayı etkinleştirmek için Ayarlar > Tarih ve Saat > Otomatik Tarih ve Saat'i seçin:

Şekil 1. Otomatik tarih ve saati seçme

Zaman kaynaklarını yapılandırma

Otomatik saat algılamaya hangi saat kaynaklarının dahil edileceğini ve bu saat kaynaklarının hangi öncelikte dikkate alınacağını belirtmek için cihazın kaynak yapılandırma dosyasını (core/res/res/values/config.xml) değiştirmeniz gerekir:

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

Bu örnekte, otomatik saat algılamada telephony ve network dikkate alınır ve telephony saat önerileri, network saat önerilerinden öncelikli olarak değerlendirilir.

Genel olarak, daha yüksek öncelikli bir kaynaktan gelen öneriler geçersizse veya çok eskiyse yoksayılır. Ayrıca, en yüksek öncelikli geçerli öneri, cihazın mevcut sistem saatiyle birkaç saniye içinde eşleşirse (varsayılan değer iki (2) saniyedir) saat değiştirilmez.

Daha düşük zaman sınırı

Android 12, zaman önerilerini doğrularken kullanılacak yeni bir düşük zaman sınırı sağlar. Bu özellikten önce otomatik saat algılama, önerilen gelen UTC saatini doğrulamıyordu. Bu özellik sayesinde, alt sınırdan önce geçen süreler atılır.

Alt sınır değeri, derleme zaman damgasından türetilen bir tarihten belirlenir. Bu, sistem resmi oluşturulmadan önce geçerli bir zamanın gerçekleşemeyeceği ilkesine dayanır. Android üst sınır uygulamaz.

GNSS zaman önerileri

gnss zaman kaynağı, Android 12'de yenidir ve GPS sinyalleri tarafından sağlanır. Bu, telephony ve network'ün kullanılamadığı durumlarda zaman için güvenilir bir kaynaktır. Bu seçenek, konum güncellemelerini pasif olarak dinleyen SystemServer'daki yeni GnssTimeUpdateService işlevine eklenir. Geçerli bir konum alındığında GnssTimeUpdateService, TimeDetectorService'e bir öneride bulunur. TimeDetectorService, sistem saatinin güncellenip güncellenmeyeceğini belirler.

gnss zaman kaynağı, AOSP'de varsayılan olarak etkinleştirilmez ve bu nedenle iş ortakları tarafından etkinleştirilmelidir:

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

Bu özelliği etkinleştirmek için:

  1. config_enableGnssTimeUpdateService adlı cihazı güncelleyin. config_enableGnssTimeUpdateService değeri true olarak ayarlanmalıdır.
  2. config_autoTimeSourcesPriority adlı cihazı güncelleyin. gnss, config_autoTimeSourcesPriority için öğe listesine eklenmelidir. gnss değerinin öncelik listesindeki konumu, diğer kaynaklardan gelen değerlere göre GNSS önerilerine verilen önceliği belirler.

Güç üzerindeki etkisi

GnssTimeUpdateService, konum güncellemelerini pasif olarak dinler. Yani ek güç tüketmek için GPS'yi hiçbir zaman etkin şekilde açmaz. Sonuç olarak, GNSS kaynağı etkinleştirildiğinde tüketilen güç önemsizdir. Bu durum, sistemdeki başka bir uygulama veya hizmet aktif olarak konum güncellemesi istemediği sürece GnssTimeUpdateService'ün konum güncellemesi almadığı ve GNSS zamanı önermediği anlamına da gelir.

Test

Uyumluluk Test Paketi (CTS)

GNSS tarafından sağlanan zamanın kullanılabilir olduğunu doğrulamak için bir CTS testi sağlanır. Ayrıntılı bilgi için LocationShellCommand.java başlıklı makaleyi inceleyin.

Birim testleri

Temel birim testlerini aşağıdaki dosyada bulabilirsiniz:

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

Manuel testler

Bu özelliği test etmek için LocationShellCommand.java'e yeni komutlar eklendi. Bir konumu ve ilişkili GNSS saatini belirtebileceğiniz test sağlayıcıları eklemek için bu komutları kullanın. GnssTimeUpdateService bu konum güncellemelerini dinler ve düzenli olarak öneriler sunar.

Not: Bu komutların arayüzü, sürümler arasında değişebilir.

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

Harici zaman önerileri

Harici zaman önerileri, Android'e otomatik zaman önerileri sağlamanın başka bir yoludur. Bu yeni seçenekler, Android'e tamamen özelleştirilmiş zaman önerileri sunmanızı sağlar. Bu öneriler, gerçek zamanlı saat, GNSS, NITZ veya başka bir zaman kaynağının bir kombinasyonunu kullanabilen çeşitli ECU'lardan gelebilir.

Android 12'de, external zaman önerileri olarak değerlendirilebilecek aşağıdaki öneriler mevcuttur:

  • VHAL mülkleri. EPOCH_TIME adlı yeni bir VHAL mülkü sağlanır. Bu özellik, 1/1/1970 UTC tarihinden itibaren geçen milisaniye sayısını belirtir. Değeri, yeni bir sistem saati önermek için Android TimeManager'e aktarılabilir. Bu özelliği güncelleyen örnek bir VHAL uygulaması, aşağıdaki referans uygulamada sağlanmıştır.
  • Sistem API'leri Sisteme harici bir zaman önerisi sağlamak için TimeManager'da suggestExternalTime() adlı yeni bir yöntem kullanılabilir. Sistem, harici saat önerilerini dikkate alacak şekilde yapılandırılmışsa (yapılandırma dosyasında config_autoTimeSourcesPriority kullanılarak) bu yönteme iletilen zaman damgası, daha öncelikli bir saat önerisi yoksa sistem saatini ayarlamak için kullanılır.

Aşağıda açıklandığı şekilde harici bir zaman çözümü uygulayabilirsiniz:

  1. Kaynak yapılandırma dosyasını (core/res/res/values/config.xml) güncelleyin ve ardından external değerini config_autoTimeSourcesPriority dosyasına ekleyin:
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>

    Bu işlem, Android'e sistem saatini ayarlarken harici saat önerilerine en yüksek önceliği vermesini söyler. Araçtaki donanım, yeni EPOCH_TIME VHAL mülküne bir zaman damgası önerisi yazar.

  2. Tedarikçi firma tarafından sağlanan bir uygulama bu mülkü okur ve TimeManager.suggestExternal()'yi çağırır. Android, sağlanan zaman damgasını yeni sistem saati değeri olarak kullanabilir.