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
中。詳情請參閱「時間來源優先順序」。
裝置設定
本節說明裝置製造商如何設定網路時間偵測系統。
基本 AOSP 設定位於
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
服務取得的時間:
SystemClock.currentNetworkTimeClock()
方法。- 內部平台函式。舉例來說,A-GPS 取得網路時間資訊後,就能更快完成 GNSS (位置) 的首次定位。
偵錯和測試
以下章節說明用於偵錯及測試網路時間偵測功能的 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