網路時間偵測

Android 裝置會自動嘗試從網路來源取得正確的 Unix 紀元時間。Android 會使用 SNTP 通訊協定 (使用 UDP 通訊協定) 取得時間資訊。

本頁所述的元件是自動時間偵測系統的一部分,稱為網路時間來源。如果裝置支援自動時間偵測功能,且 time_detector 服務已設定為使用這項功能,則可使用網路時間伺服器的時間訊號來設定 Android 裝置的系統時鐘。

根據預設,Android 會使用網路時間來源做為主要的自動時間偵測來源。

網路時間偵測系統

在 Android 系統伺服器中執行的 network_time_update_service 服務會實作網路時間偵測系統。這項服務會定期使用 SNTP 從伺服器取得時間信號。這項服務也會監控網路連線,並在連線品質不佳一段時間後,在沒有任何近期時間訊號時觸發時間重新整理。

network_time_update_service 服務會在開機後和首次建立網路連線時,嘗試取得時間信號。服務接著會嘗試讓所持有的最新訊號保持新鮮。這項功能可平衡個別 Android 裝置的需求,以及全球許多 Android 裝置刷新時間時可能產生的大量負載。

network_time_update_service 會使用內部 API,將網路時間建議提交至 time_detector 服務。其他 Android 平台元件會使用這些網路時間建議。

收到網路時間來源的建議後,time_detector 服務會根據設定的優先順序規則,決定是否更新系統時鐘。

如要設定自動時間偵測系統,以便使用網路來源建議來自動設定系統時鐘,請使用 core/res/res/values/config.xml 系統伺服器設定檔。確認 network 值位於 config_autoTimeSourcesPriority 的所需位置。詳情請參閱「時間來源優先順序」。

裝置設定

本節說明裝置製造商如何設定網路時間偵測系統。

基本 Android 開放原始碼計畫設定位於 frameworks/base/core/res/res/values/config.xml

設定鍵 Android 開放原始碼計畫值 說明
config_ntpRetry 3 在重新整理失敗後,系統會以較短的 NTP 輪詢間隔 (config_ntpPollingIntervalShorter) 嘗試網路時間輪詢,直到退回並使用正常的輪詢間隔 (config_ntpPollingInterval) 為止。如果值小於 0,表示系統會以較短的 NTP 輪詢間隔重試輪詢,直到成功重新整理為止。
config_ntpPollingInterval 64800000 (18 小時) 正常的網路時間輪詢間隔 (以毫秒為單位)。
config_ntpPollingIntervalShorter 60000 (1 分鐘) 重試網路時間的輪詢間隔,以毫秒為單位。在時間重新整理作業失敗時使用。
config_ntpServers 單一項目:ntp://time.android.com 用於取得準確時間的 NTP 伺服器。項目必須符合以下格式:ntp://<host>[:port]
這不是已註冊的 IANA URI 配置。
config_ntpTimeout 5000 等待 NTP 伺服器回應的時間 (以毫秒為單位)。

伺服器

根據預設,AOSP 會使用 time.android.com 的時間伺服器,這是 Google Public NTP 的別名。這項服務沒有服務水準協議。詳情請參閱 Google Public NTP 常見問題

支援多個伺服器

在 Android 14 以上版本中,此架構支援多個 NTP 伺服器。這項功能可支援以下情況:裝置以單一設定分散至全球,但在某些地區,time.android.com 等伺服器的存取權受限。

演算法會嘗試 config_ntpServers 設定鍵中指定的每個伺服器。找到回應的伺服器後,系統會繼續使用該伺服器,直到重新整理失敗或裝置重新啟動為止。

準確度

Android 的預設網路時間同步功能會使用 SNTP,並在每天約一小時內執行一次時間查詢,以確保系統隨時都能取得最新的時間信號。

網路延遲效應是 Android 實作 SNTP 時,造成時間不準確的最大原因。SNTP 會假設網路延遲時間對稱,也就是說,要求的網路延遲時間與回應的網路延遲時間相同,而正確的時間就位於該網路來回傳輸的正中間。通常網路封包往返時間約為幾百毫秒,在有線網路上,延遲時間幾乎對稱,導致使用者幾乎無法察覺的不準確度。不過,在行動或無線電話通訊中,有幾個階段會在網路交易中插入相對較長的非對稱延遲時間,導致更大的不準確性。

config_ntpTimeout 的 AOSP 預設設定設為 5000 毫秒,如果所有網路延遲都集中在傳入或傳出路徑,理論上最大誤差約為 2.5 秒。

整體系統時鐘的準確度也會受到 Android 裝置在取得時間信號後,追蹤經過時間的準確度影響。這項問題不僅限於網路時間偵測,也與 Android 上的所有時間控管相關,這也是 time_detector 服務忽略舊時間建議的原因。network_time_update_service 服務會定期使用 config_ntpPollingInterval 間隔進行重新整理,以便為 time_detector 服務提供最新的時間建議,並確保 time_detector 服務不會改用低優先順序 (通常準確度較低) 或偶爾不正確的時間來源,例如 telephony

使用自動時間偵測功能時,裝置系統時鐘的準確度可能會受到 time_detector 服務的其他設定影響,例如會影響時鐘調整前,建議時間與目前系統時鐘時間差異程度的常數和標記 (ServiceConfigAccessorImpl.java)。

裝置製造商可以使用上述設定選項和常數修改精確度。不過,請務必瞭解平台 SNTP 實作方式的限制,以及更頻繁的網路作業、更頻繁但較小時鐘調整對裝置上執行的應用程式造成的影響,以及對伺服器負載的影響。

網路時間的其他用途

如果未設定使用 network 來源的自動時間偵測功能,或是使用者已停用自動時間偵測功能,則下列元件仍會使用 network_time_update_service 服務取得的時間:

偵錯和測試

以下章節將說明用於偵錯及測試網路時間偵測功能的 Shell 指令。

與 network_time_update_service 服務互動

如要傾印 network_time_update_service 的目前狀態,請使用:

adb shell cmd network_time_update_service dump

如要查看可協助測試的一組指令列選項,請使用:

adb shell cmd network_time_update_service help