自動偵測時間

自動偵測時間會從不同來源接收建議時間,選擇 然後將 Android 系統時鐘設為相符。提供先前的 Android 版本 兩種方法設定日期和時間:依使用者手動設定或自動偵測時間,以及 執行下列任一操作:

  • telephony 會使用網路身分和時區 (NITZ) 電話信號。
  • network 使用網路時間通訊協定 (NTP) 時間伺服器。

每個選項都需要連線到外部網路,但 Android 不一定支援這項功能 Automotive。舉例來說,在某些國家/地區,某些車款可能沒有內建電話服務。因此 全球衛星導航系統 (GNSS) 時間是系統來源 讓您未使用網路連線

即將推出的 Android 版本還多了兩個選項,可自動偵測及設定時間:

  • gnss會使用全球衛星 導航系統 (GNSS)。
  • external 使用 VHAL 屬性或 System API。

啟用自動偵測時間功能

如要啟用自動偵測時間功能,請務必依序選取「設定」> 日期與時間 >自動設定日期與時間:

圖 1. 選取「自動設定日期」和時間

設定時間來源

指定要納入自動偵測時間的來源和優先順序 請將這些時間來源納入考量,您必須修改裝置的資源 設定檔,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>

這個範例會將 telephonynetwork 納入考量 依照自動偵測時間和 telephony 時間建議 在建議 network 次的時間之前。

一般來說,如果建議,系統會忽略優先順序較高的來源提供的建議 無效或建議時間太舊。此外,如果優先順序最高的有效建議 比對裝置目前的系統時鐘時間到幾秒內 (預設值) 大小為 2 (2) 秒,則時間不會變更。

下限

Android 12 提供全新的短時差, 正在驗證建議時間在此之前,自動偵測時間不會驗證 建議的傳入時間 (世界標準時間)有了這項功能 在下限之前經過的時間 被捨棄。

下限值取決於建構時間戳記的日期。這張投影片 原則上,在建構系統映像檔之前不能超過有效時間。Android 不支援 執行上限

GNSS 時間建議

gnss 時間來源是 Android 12 的全新時間,由 GPS 信號提供。這是 確保 telephonynetwork 無法使用時,都會有可靠的資料來源。 這個選項會新增至以下位置的新 GnssTimeUpdateService: 被動監聽位置更新的系統伺服器。收到有效的位置後, GnssTimeUpdateService 會向 TimeDetectorService 提供建議; 就會決定是否應更新系統時鐘。

根據預設,Android 開放原始碼計畫並未啟用 gnss 時間來源,因此 必須由合作夥伴啟用:

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

如要啟用這項功能,請按照下列步驟操作:

  1. 更新「config_enableGnssTimeUpdateService」。請注意, 「config_enableGnssTimeUpdateService」必須設為「true」。
  2. 更新「config_autoTimeSourcesPriority」。必須將 gnss 新增至 「config_autoTimeSourcesPriority」的項目清單。gnss 的位置 會決定對 GNSS 建議所指定的優先順序 從其他來源收集的資料

對電源的影響

GnssTimeUpdateService 會監聽位置更新,這表示 一律不主動開啟 GPS 以消耗額外電力。因此,當在任何情況下 啟用 GNSS 來源後,只能忽略微失情況。也就是說,除非 系統主動要求位置更新通知,GnssTimeUpdateService 不會取得位置資訊 更新並提供 GNSS 時間建議

測試

相容性測試套件 (CTS)

系統會提供 CTS 測試,用來驗證 GNSS 提供的時間是否有空。詳情請參閱 LocationShellCommand.java

單元測試

請參閱下列檔案的基本單元測試:

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

手動測試

為了測試這項功能,我們在 LocationShellCommand.java。使用這些指令來新增測試 指定位置和相關 GNSS 時間。 GnssTimeUpdateService 會定期聆聽這些位置更新通知 提出建議。

注意:這些指令的介面可能會在不同版本之間變更。

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

外部時間建議

外部時間建議是另一種提供自動時間建議的方式。 Android。這個新選項可讓您完全自訂 Android、 源自各種 ECU 的 ECU,可依需求使用即時時鐘、 GNSS、NITZ 或任何其他時間來源。

下列 Android 12 提供建議可視為 external 建議時間:

  • VHAL 屬性:新的 VHAL 屬性 提供了名為 EPOCH_TIME 的映像檔。這個屬性代表 自 1970 年 1 月 1 日 (世界標準時間) 起經過的毫秒數。其值可以傳遞至 Android TimeManager 可建議新的系統時間。VHAL 範例 更新這個屬性的實作方式,是透過 參照導入
  • 系統 API:名為 suggestExternalTime() 的新方法 是 TimeManager,針對系統提供外部時間建議。 如果系統設定將外部時間建議納入考量 (使用 config_autoTimeSourcesPriority),時間戳記 傳遞至這個方法用來設定系統時間 (「如果」沒有延遲時間值) 有優先時間建議。

您可以按照下列說明實作外部時間解決方案:

  1. 更新資源設定檔 (core/res/res/values/config.xml) 然後將 external 值新增至 config_autoTimeSourcesPriority
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>

    這樣就能指示 Android 在設定外部時間建議時,將建議的優先順序設為最高 系統時鐘。車輛上的硬體會將時間戳記建議寫入新的 EPOCH_TIME VHAL 屬性

  2. 供應商提供的應用程式讀取這項資源並呼叫 TimeManager.suggestExternal()。Android 接著就能使用提供的時間戳記 做為新系統時鐘值。