Otomatik zaman algılama

Otomatik zaman algılama, çeşitli kaynaklardan zaman önerileri alır, en iyi seçeneği seçer ve ardından Android'deki sistem saatini buna uyacak şekilde ayarlar. Önceki Android sürümleri, tarih ve saati ayarlamak için kullanıcı başına manuel olarak veya otomatik zaman algılamayla ve aşağıdaki seçeneklerden biriyle ayarlanarak iki yol sağlıyordu:

  • telephony , Ağ Kimliği ve Saat Dilimi (NITZ) telefon sinyallerini kullanır.
  • network Ağ Zaman Protokolü (NTP) zaman sunucularını kullanır.

Her seçenek, Android Automotive'de her zaman bulunmayan harici ağlara bağlantı gerektirir. Örneğin, bazı ülkelerde bazı arabalarda yerleşik telefon bulunmayabilir. Bu nedenle, Global Uydu Navigasyon Sistemleri (GNSS) zamanı, ağ bağlantısı olmadığında kullanmanız için sistem zamanı kaynağı olarak sağlanır.

Yaklaşan bu Android sürümü, zamanı otomatik olarak algılamak ve ayarlamak için iki seçenek daha sunuyor:

  • gnss Küresel Uydu Navigasyon Sistemlerini (GNSS) kullanır.
  • external bir VHAL özelliğini veya Sistem API'sini kullanır.

Otomatik zaman algılamayı etkinleştir

Otomatik saat algılamayı etkinleştirmek için Ayarlar > Tarih ve Saat > Otomatik Tarih ve Saat'i seçtiğinizden emin olun:

Şekil 1. Otomatik Tarih ve Saati Seçin

Zaman kaynaklarını yapılandırma

Otomatik zaman tespitine hangi zaman kaynaklarının dahil edileceğini ve bu zaman kaynaklarının dikkate alınması gereken önceliği 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 zaman tespitinde telephony ve network dikkate alınır ve telephony süresi önerileri, network zamanı önerilerinden önce önceliklendirilir.

Genel olarak konuşursak, daha yüksek öncelikli bir kaynaktan gelen öneriler, öneri geçersizse veya öneri çok eskiyse dikkate alınmaz. Ayrıca, en yüksek öncelikli geçerli öneri, cihazın mevcut sistem saati zamanıyla birkaç saniye içinde eşleşirse (varsayılan değer iki (2) saniyedir), zaman değişmeyecektir.

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

Android 12, zaman önerilerini doğrularken kullanılacak yeni bir alt süre sınırı sağlar. Bu özellikten önce, otomatik saat algılama, önerilen gelen UTC saatini doğrulamazdı. 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 tarihe göre belirlenir. Bu, sistem görüntüsü oluşturulmadan önce geçerli bir zamanın oluşamayacağı prensibiyle çalışır. Android bir üst sınır uygulamaz.

GNSS zamanı önerileri

gnss zaman kaynağı Android 12'de yenidir ve GPS sinyalleriyle sağlanır. Bu, telephony ve network mevcut olmadığı zamanlar için güvenilir bir kaynaktır. Bu seçenek, konum güncellemelerini pasif olarak dinleyen SystemServer'daki yeni GnssTimeUpdateService eklenir. Geçerli bir konum alındığında, GnssTimeUpdateService TimeDetectorService bir öneride bulunur ve bu daha sonra sistem saatinin güncellenmesi gerekip gerekmediğini belirler.

Varsayılan olarak, gnss zaman kaynağı AOSP'de etkin değildir ve bu nedenle ortaklar tarafından etkinleştirilmesi 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>
    <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 güncelleyin. config_enableGnssTimeUpdateService değeri true olarak ayarlanmalıdır.
  2. config_autoTimeSourcesPriority güncelleyin. config_autoTimeSourcesPriority için öğe listesine gnss eklenmelidir. gnss ö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 bir şekilde dinler; bu, ek güç tüketmek için GPS'i hiçbir zaman aktif olarak açmadığı anlamına gelir. Sonuç olarak, GNSS kaynağı etkinleştirildiğinde tüketilen güç ihmal edilebilir düzeydedir. Bu aynı zamanda sistemdeki başka bir uygulama veya hizmetin aktif olarak konum güncellemesi talep etmemesi durumunda GnssTimeUpdateService konum güncellemesi almayacağı ve bir GNSS zamanı önermeyeceği anlamına da gelir.

Test yapmak

Uyumluluk test paketi (CTS)

GNSS tarafından sağlanan zamanın mevcut olduğunu doğrulamak için bir CTS testi sağlanır. Ayrıntılar için bkz. LocationShellCommand.java .

Birim testleri

Aşağıdaki dosyadaki temel birim testlerine bakın:

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

Manuel testler

Bu özelliği test etmek için LocationShellCommand.java dosyasına yeni komutlar eklendi. Bir konumu ve ilgili GNSS zamanını belirtebileceğiniz test sağlayıcılarını eklemek için bu komutları kullanın. GnssTimeUpdateService bu konum güncellemelerini dinler ve periyodik olarak önerilerde bulunur.

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, gerçek zamanlı saat, GNSS, NITZ veya başka herhangi bir zaman kaynağının birleşimini kullanabilen çeşitli ECU'lardan gelebilen tamamen özelleştirilmiş zaman önerileri sunmanıza olanak tanır.

Aşağıdaki öneriler Android 12'de external zaman önerileri olarak değerlendirilebilir:

  • VHAL özellikleri. EPOCH_TIME adlı yeni bir VHAL özelliği sağlandı. Bu özellik, 1/1/1970 UTC'den bu yana geçen milisaniye sayısını belirtir. Yeni bir sistem saati önermek için değeri Android TimeManager aktarılabilir. Bu özelliği güncelleyen örnek bir VHAL uygulaması aşağıdaki referans uygulamasında verilmiştir.
  • Sistem API'leri. Sisteme harici bir zaman önerisi sağlamak için TimeManager'da suggestExternalTime() adı verilen yeni bir yöntem mevcuttur. Sistem harici zaman önerilerini dikkate alacak şekilde yapılandırılmışsa (yapılandırma dosyasında config_autoTimeSourcesPriority kullanılarak), daha yüksek öncelikli zaman önerileri yoksa , bu yönteme iletilen zaman damgası sistem saatini ayarlamak için kullanılır.

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

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

    Bunu yapmak, Android'e sistem saatini ayarlarken harici zaman önerilerine en yüksek önceliği vermesi talimatını verir. Araçtaki donanım, yeni EPOCH_TIME VHAL özelliğine bir zaman damgası önerisi yazar.

  2. Satıcı tarafından sağlanan bir uygulama bu özelliği okur ve TimeManager.suggestExternal() öğesini çağırır. Android daha sonra sağlanan zaman damgasını yeni sistem saati değeri olarak kullanabilir.