Android 裝置自動嘗試從網路來源取得正確的 Unix 紀元時間。 Android使用SNTP協議,它使用UDP協議來獲取時間資訊。
本頁所描述的元件是稱為網路時間原點的自動時間偵測系統的一部分。當裝置支援自動時間偵測且time_detector
服務配置為使用它時,來自網路時間伺服器的時間訊號可用於設定 Android 裝置的系統時脈。
預設情況下,Android 使用網路時間原點作為主要自動時間來偵測原點。
網路時間偵測系統
Android系統伺服器中執行的network_time_update_service
服務實作了網路時間偵測系統。該服務定期使用 SNTP 從伺服器取得時間訊號。該服務還監控網路連接,並在長時間連接不良後沒有可用的最新時間訊號時觸發時間刷新。
network_time_update_service
服務嘗試在啟動後以及首次建立網路連線時取得時間訊號。然後,該服務會嘗試保持最新的訊號。它平衡了單一 Android 裝置的需求與全球許多 Android 裝置刷新時間可能產生的大量負載。
使用內部 API, network_time_update_service
向time_detector
服務提交網路時間建議。其他 Android 平台元件隨後會使用這些網路時間建議。
time_detector
服務收到網路時間來源的建議後,根據配置的優先權規則決定是否更新系統時脈。
若要將自動時間偵測系統設定為使用網路來源建議來自動設定係統時鐘,請使用core/res/res/values/config.xml
系統伺服器設定檔。確保值network
包含在config_autoTimeSourcesPriority
中的所需位置。詳細資訊請參閱時間來源優先順序。
設備配置
本節介紹設備製造商如何設定網路時間檢測系統。
基本 AOSP 設定位於frameworks/base/core/res/res/values/config.xml
:
配置鍵 | AOSP值 | 描述 |
---|---|---|
config_ntpRetry | 3 | 刷新失敗後,這是系統在退出並使用正常輪詢間隔 ( config_ntpPollingIntervalShorter ) 之前嘗試使用較短 NTP 輪詢間隔 ( 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的別名。該服務沒有 SLA。有關詳細信息,請參閱Google 公共 NTP 常見問題。
多伺服器支援
對於 Android 14 及更高版本,此框架支援多個 NTP 伺服器。這支援設備透過單一配置分佈在全球的情況,但對伺服器(例如time.android.com
的存取在某些地方受到限制。
演算法會嘗試config_ntpServers
組態中指定的每個伺服器。當找到回應的伺服器時,系統將繼續使用該伺服器,直到刷新失敗或裝置重新啟動。
準確性
Android 的預設網路時間同步使用 SNTP 和大約每天一次的單次時間查詢,以嘗試確保它始終具有最近的時間訊號。
網路延遲效應是 Android 的 SNTP 實現時間不準確的最大原因。 SNTP 假設對稱網路延遲,即請求的網路延遲與回應的網路延遲相同,而正確的時間恰好位於該網路往返的中間。通常,網路往返時間約為幾百毫秒,並且在有線網路上,延遲接近對稱,導致使用者幾乎無法察覺的不準確程度。然而,對於移動或無線電話,存在幾個階段,在這些階段中,相對長的、不對稱的延遲可能被插入到網路事務中,從而導致更大的不準確性。
在 AOSP 預設設定config_ntpTimeout
設定為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