Android 設置/修改系統NTP服務地址

在這里插入圖片描述

Android 手機的 NTP 時間同步(網絡時間同步)主要依賴網絡,但系統時間來源還包括其他方式,整體時間校準機制是多種來源的結合。具體可分為以下幾類:

1. 網絡 NTP 同步(最主要方式)

這是 Android 設備獲取時間的核心方式,通過訪問 NTP 服務器實現:

  • 原理:設備連接 Wi-Fi 或移動數據(蜂窩網絡)時,會定期向預設的 NTP 服務器(如 time.android.com、廠商自定義服務器等)發送請求,獲取標準時間并校準本地時間。
  • 特點:依賴網絡連接,精度通常在毫秒到秒級,是日常使用中最主要的時間來源。

2. GPS/位置服務(輔助時間來源)

GPS 不僅提供位置信息,也會同步時間:

  • 原理:GPS 衛星內置高精度原子鐘,設備接收 GPS 信號時,會同時獲取衛星的精確時間(UTC 時間),并結合時區信息轉換為本地時間。
  • 特點
    • 精度極高(毫秒級),不受網絡限制,戶外定位時自動同步。
    • 通常作為網絡同步的補充,尤其在網絡不穩定或無網絡時提供時間參考。
    • 部分設備在開啟“位置服務”后,會優先使用 GPS 時間校準系統時間。

3. 移動網絡(蜂窩網絡)時間

部分運營商的移動網絡(如 4G/5G)會通過信令傳遞時間信息:

  • 原理:設備接入蜂窩網絡時,可能從基站獲取時間(類似 NTP 的簡化機制),尤其在早期 2G/3G 網絡中更常見。
  • 特點:精度較低(通常秒級),依賴運營商網絡配置,現代設備更多以 NTP 同步為主。

4. 本地保存的時間(離線臨時使用)

設備斷電或重啟時,會依賴內置的 RTC(實時時鐘)芯片維持基本時間:

  • 原理:RTC 芯片由設備內置電池供電,即使主電源關閉也能運行,保存最近同步的時間。
  • 特點:精度低(可能每天偏差幾秒到幾分鐘),僅作為離線時的臨時時間來源,聯網后會立即通過 NTP 或 GPS 校準。

總的來說, Android 手機的時間來源是多方式協同的:

  • 主要來源:網絡 NTP 同步(最常用,依賴網絡)。
  • 輔助來源:GPS 時間(高精度,依賴定位信號)、蜂窩網絡時間(運營商提供)。
  • fallback 機制:本地 RTC 時鐘(離線時臨時使用)。

系統會根據網絡狀態、定位信號強度等自動選擇最優時間來源,確保時間準確性。例如:聯網時優先用 NTP,戶外定位時結合 GPS 校準,離線時依賴 RTC 并在聯網后修正偏差。


NTP 服務:

frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java

    public NetworkTimeUpdateService(Context context) {mContext = context;mTime = NtpTrustedTime.getInstance(context);mAlarmManager = mContext.getSystemService(AlarmManager.class);mTimeDetector = mContext.getSystemService(TimeDetector.class);mCM = mContext.getSystemService(ConnectivityManager.class);Intent pollIntent = new Intent(ACTION_POLL, null);// Broadcast alarms sent by system are immutablemPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent,PendingIntent.FLAG_IMMUTABLE);mPollingIntervalMs = mContext.getResources().getInteger(com.android.internal.R.integer.config_ntpPollingInterval);mPollingIntervalShorterMs = mContext.getResources().getInteger(com.android.internal.R.integer.config_ntpPollingIntervalShorter);mTryAgainTimesMax = mContext.getResources().getInteger(com.android.internal.R.integer.config_ntpRetry);mWakeLock = context.getSystemService(PowerManager.class).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);}private void onPollNetworkTimeUnderWakeLock(int event) {long currentElapsedRealtimeMillis = SystemClock.elapsedRealtime();// Force an NTP fix when outdatedNtpTrustedTime.TimeResult cachedNtpResult = mTime.getCachedTimeResult();if (cachedNtpResult == null || cachedNtpResult.getAgeMillis(currentElapsedRealtimeMillis)>= mPollingIntervalMs) {if (DBG) Log.d(TAG, "Stale NTP fix; forcing refresh");boolean isSuccessful = mTime.forceRefresh();if (isSuccessful) {mTryAgainCounter = 0;} else {String logMsg = "forceRefresh() returned false: cachedNtpResult=" + cachedNtpResult+ ", currentElapsedRealtimeMillis=" + currentElapsedRealtimeMillis;if (DBG) {Log.d(TAG, logMsg);}mLocalLog.log(logMsg);}cachedNtpResult = mTime.getCachedTimeResult();}//....}

frameworks/base/core/java/android/util/NtpTrustedTime.java

    @GuardedBy("this")private NtpConnectionInfo getNtpConnectionInfo() {final ContentResolver resolver = mContext.getContentResolver();final Resources res = mContext.getResources();final String hostname;if (mHostnameForTests != null) {hostname = mHostnameForTests;} else {String serverGlobalSetting =Settings.Global.getString(resolver, Settings.Global.NTP_SERVER);if (serverGlobalSetting != null) {hostname = serverGlobalSetting;} else {hostname = res.getString(com.android.internal.R.string.config_ntpServer);}}final Integer port;if (mPortForTests != null) {port = mPortForTests;} else {port = SntpClient.STANDARD_NTP_PORT;}final int timeoutMillis;if (mTimeoutForTests != null) {timeoutMillis = (int) mTimeoutForTests.toMillis();} else {int defaultTimeoutMillis =res.getInteger(com.android.internal.R.integer.config_ntpTimeout);timeoutMillis = Settings.Global.getInt(resolver, Settings.Global.NTP_TIMEOUT, defaultTimeoutMillis);}return TextUtils.isEmpty(hostname) ? null :new NtpConnectionInfo(hostname, port, timeoutMillis);}@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)public boolean forceRefresh() {synchronized (this) {NtpConnectionInfo connectionInfo = getNtpConnectionInfo();if (connectionInfo == null) {// missing server config, so no NTP time availableif (LOGD) Log.d(TAG, "forceRefresh: invalid server config");return false;}ConnectivityManager connectivityManager = mConnectivityManagerSupplier.get();if (connectivityManager == null) {if (LOGD) Log.d(TAG, "forceRefresh: no ConnectivityManager");return false;}final Network network = connectivityManager.getActiveNetwork();final NetworkInfo ni = connectivityManager.getNetworkInfo(network);// This connectivity check is to avoid performing a DNS lookup for the time server on a// unconnected network. There are races to obtain time in Android when connectivity// changes, which means that forceRefresh() can be called by various components before// the network is actually available. This led in the past to DNS lookup failures being// cached (~2 seconds) thereby preventing the device successfully making an NTP request// when connectivity had actually been established.// A side effect of check is that tests that run a fake NTP server on the device itself// will only be able to use it if the active network is connected, even though loopback// addresses are actually reachable.if (ni == null || !ni.isConnected()) {if (LOGD) Log.d(TAG, "forceRefresh: no connectivity");return false;}if (LOGD) Log.d(TAG, "forceRefresh() from cache miss");final SntpClient client = new SntpClient();final String serverName = connectionInfo.getServer();final int port = connectionInfo.getPort();final int timeoutMillis = connectionInfo.getTimeoutMillis();if (client.requestTime(serverName, port, timeoutMillis, network)) {long ntpCertainty = client.getRoundTripTime() / 2;mTimeResult = new TimeResult(client.getNtpTime(), client.getNtpTimeReference(), ntpCertainty);return true;} else {return false;}}}

系統默認采用android的NTP服務器:

frameworks/base/core/res/res/values/config.xml

<string translatable="false" name="config_ntpServer">2.android.pool.ntp.org</string>

frameworks/base/core/java/android/provider/Settings.java

       /** Preferred NTP server. {@hide} */public static final String NTP_SERVER = "ntp_server";

通常, 系統沒有提供可視界面供用戶設置NTP服務器的接口. 可以通過adb命令來設置:

# 設置NTP服務器
adb shell settings put global "ntp_server" "ntp.aliyun.com"# 關閉 和 打開 自動時間同步
adb shell settings put global "auto_time" 0
adb shell settings put global "auto_time" 1

實際測試發現, AOSP中默認的NTP服務器地址, 經常是訪問不上的, 所以, 可以考慮更換為aliyun的ntp服務器;
測試過程:

  1. 關閉自動設置時間(auto_time)
  2. 更改當前系統時間為任意非準確時間
  3. 關閉網絡/有SIM卡可以拔出來
  4. 重啟系統, 清除NTP緩存數據, 否則, 系統會從緩存的NTP數據來更新當前系統時間
  5. 啟動后時間是錯誤的, 打開WIFI, 打開自動設置時間, 正常情況下系統時間成功更新

適用性

  1. 國內的手機廠商大部分采用的是自定義的NTP服務端
  2. 某些廠商的設備(比如Oculus Quest 系列)在國內水土不服, 建議修改為國內的服務器
  3. 某些特定的行業需要自主的NTP服務器.

參考

網絡時間檢測
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918210.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918210.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu22.04 安裝vitis2023.2 卡在“Generating installed device list“.

關于這個問題&#xff0c;xilinx有官方說明&#xff0c;鏈接 原因&#xff1a;問題是 Ubuntu 20.04 缺少 libtinfo.so.5 庫。 解決辦法&#xff1a; sudo apt-get install libtinfo5

前端全棧修煉手冊:從 Vue3 到工程化的進階之路

本文將全方位覆蓋前端開發的核心知識&#xff0c;從 Vue3 框架的基礎語法到復雜的工程化實踐&#xff0c;從包管理工具的使用到模塊規范的深入理解&#xff0c;帶你踏上從入門到精通的進階之路。 Vue3 框架&#xff1a;新時代前端開發的基石 Vue3 核心語法探秘 Vue3 作為目前…

Jetpack Compose 常用控件

Jetpack Compose 常用控件一、基礎展示控件&#xff1a;呈現靜態內容二、交互控件&#xff1a;響應用戶操作三、列表與網格控件&#xff1a;展示大量數據四、導航與標簽控件&#xff1a;組織頁面結構五、反饋控件&#xff1a;提示與加載狀態六、布局控件&#xff1a;組織 UI 結…

Android適配最新SplashScreen方案:讓啟動頁不再“翻車“

Android適配最新SplashScreen方案:讓啟動頁不再"翻車" 各位開發者大佬們,最近是不是又被Android的SplashScreen適配搞得焦頭爛額?別慌,今天咱們就來聊聊這個讓人又愛又恨的啟動頁適配方案,保證讓你笑出腹肌的同時,還能把技術要點牢牢掌握![6][7][9][10] 一、…

【自動駕駛】《Sparse4Dv3》代碼學習筆記

這里時間比較有限&#xff0c;優先看Sparse4Dv3方法里面相對以前改動的地方。 0.參考 代碼v1/v2/v3:https://github.com/HorizonRobotics/Sparse4D 跑起來&#xff1a;https://github.com/HorizonRobotics/Sparse4D/blob/v3.0/docs/quick_start.md 1.方法 &#xff08;1&a…

「ECG信號處理——(22)Pan-Tompkins Findpeak 閾值檢測 差分閾值算法——三種R波檢測算法對比分析」2025年8月8日

目錄 1、引言 2、算法原理 &#xff08;1&#xff09;Pan-Tompkins 算法&#xff08;方法1&#xff09; &#xff08;2&#xff09;Findpeak 閾值檢測算法&#xff08;方法2&#xff09; &#xff08;3&#xff09;差分閾值算法&#xff08;方法3&#xff09; 3、算法性能…

Qdrant Filtering:must / should / must_not 全解析(含 Python 實操)

在向量搜索中&#xff0c;過濾&#xff08;Filtering&#xff09; 是保證結果精準性和業務契合度的關鍵手段。Qdrant 的過濾機制不僅能在向量相似度檢索的基礎上疊加結構化條件&#xff0c;還提供了靈活的布爾邏輯組合&#xff0c;讓我們可以像寫數據庫查詢一樣&#xff0c;精準…

五、RuoYi-Cloud-Plus 前端項目部署以及如何改后端請求地址。

1.前情描述 前面的文章我們介紹了RuoYi-Cloud-Plus的nocos的配置內容&#xff0c;已經啟動其他服務要注意什么東西。 專欄內容在這&#xff0c;感興趣可以看看。 https://blog.csdn.net/weixin_42868605/category_13023920.html 2.前端項目部署。 官網地址&#xff1a;plus…

工作量評估

工作量評估 API 工作量評估&#xff1a; 得分 入參個數 * 0.2 業務規則 * 0.5 改動的庫表個數 * 0.3 得分&#xff08;1-2&#xff09;&#xff1a;簡單API-5人天 得分&#xff08;3-8&#xff09;&#xff1a;中等API-8人天 得分&#xff08;8-15&#xff09;&#xff1a;復…

籃球運動(動態規劃)

題目描述小明建造了一個籃球場&#xff0c;他請來了2行n列的人&#xff0c;想讓他們進行比賽。每一個人都有一個能力值&#xff0c;第一行分別為h11&#xff0c;h12&#xff0c;…&#xff0c;h1n&#xff0c;第二行為h21&#xff0c;h22&#xff0c;…&#xff0c;h2n。現在小…

區塊鏈與大數據分析技術深度解析

目錄 區塊鏈與大數據分析技術深度解析 1. 引言:當區塊鏈遇見大數據 2. 區塊鏈數據特性 2.1 數據結構差異 2.2 區塊鏈數據層級 3. 數據獲取技術 3.1 節點直連方案 3.2 鏈上數據湖架構 4. 數據分析關鍵技術 4.1 交易圖譜分析 4.2 地址聚類算法 5. 鏈上分析應用場景 5.1 反洗錢(A…

網絡基礎——網絡層級

OSI七層模型OSI七層模型名稱功能協議應用層直接為用戶應用程序&#xff08;如瀏覽器、郵件客戶端&#xff09;提供網絡服務接口。HTTP/HTTPS&#xff08;網頁瀏覽&#xff09;FTP&#xff08;文件傳輸&#xff09;SMTP/POP3&#xff08;郵件&#xff09;DNS&#xff08;域名解析…

【Redis】hash哈希,List列表

目錄 一. hash哈希 1.1.常用命令 1.1.1.HSET 1.1.2.HGET 1.1.3.HEXISTS 1.1.4.HDEL 1.1.5.HKEYS 1.1.6.HVALS 1.1.7.HGETALL 1.1.8.HMGET 1.1.9.HLEN 1.1.10.HSETNX 1.1.11.HINCRBY 1.1.12.HINCRBYFLOAT 1.2. 內部編碼 1.3. 使用場景 1.4…

MySQL相關概念和易錯知識點(4)(分組查詢、連接查詢、合并查詢、子查詢)

目錄1.分組查詢&#xff08;1&#xff09;聚合函數&#xff08;2&#xff09;group by子句&#xff08;3&#xff09;having2.連接查詢&#xff08;1&#xff09;內連接&#xff08;笛卡爾積&#xff09;&#xff08;2&#xff09;外連接&#xff08;3&#xff09;內外連接的區…

【Python 高頻 API 速學 ①】

一、為什么先學它們&#xff1f; 在真實代碼里&#xff0c;90 % 的 bug 都源于「拿到的是 A 類型&#xff0c;卻當成 B 類型用」。 把「不確定」變成「確定」——這就是類型轉換三兄弟的核心價值。二、三兄弟速覽函數一句話定位常見輸入失敗會怎樣int(x)把 x 變成整數‘42’, 3…

FFmpeg 視頻旋轉信息處理:3.4 vs 7.0.2

1. 概述 FFmpeg 在處理視頻旋轉信息方面經歷了重要的架構變化。本文檔詳細對比了 FFmpeg 3.4 和 7.0.2 在封裝&#xff08;muxing&#xff09;和解封裝&#xff08;demuxing&#xff09;視頻旋轉信息時的差異&#xff0c;并提供兼容性解決方案。文檔內容由Claude Sonnet 4輔助撰…

《Resolving tissue complexity by multimodal spatial omics modeling with MISO》

概念多模態空間組學&#xff1a;簡單來說&#xff0c;就是同時研究生物組織里的多種分子信息&#xff08;比如基因表達、蛋白質、代謝物、表觀遺傳標記等&#xff09;&#xff0c;而且這些信息還帶有空間位置。MISO&#xff08;MultI-modal Spatial Omics&#xff09;是這篇論文…

三階段提交(3PC)協議的全面解析:理論、機制與實踐局限性

第一部分&#xff1a;非阻塞提交的起源&#xff1a;從兩階段提交&#xff08;2PC&#xff09;的缺陷到三階段提交&#xff08;3PC&#xff09;的構想在分布式計算領域&#xff0c;確保跨多個獨立節點執行的事務的完整性是一項至關重要的挑戰。這些節點或站點可能在地理上分散&a…

衰減器的計算

pi型衰減器&#xff0c;如下圖所示。 它適用于輸入輸出阻抗匹配的情況下&#xff0c;還能進行衰減。 不過當輸入輸出阻抗不匹配時&#xff0c;2個R1也會不相等。 已知特性阻抗Z0&#xff0c;衰減比AVin/Vout&#xff0c;怎么計算R1、R2&#xff1f; 1、電阻分壓。 Vout Vi…

Day02 員工管理,分類管理

新增員工需求分析和設計產品原型&#xff1a;接口設計&#xff1a;本項目約定&#xff1a;管理端發出的請求&#xff0c;統一使用 /admin 作為前綴用戶端發出的請求&#xff0c;統一使用 /user 作為前綴數據庫表設計&#xff1a;代碼開發根據新增員工接口設計對應的 DTO&#x…