NTP流程

NTP时间:

​ SntpClient:具体网络UDP请求
​ 路径:base/core/java/android/net/SntpClient.java

NtpTrustedTime:单例
路径:base/core/java/android/util/NtpTrustedTime.java

参数获取

final String defaultServer = res.getString(com.android.internal.R.string.config_ntpServer);
final long defaultTimeout = res.getInteger(com.android.internal.R.integer.config_ntpTimeout);
final String secureServer = Settings.Global.getString(resolver, Settings.Global.NTP_SERVER);
final long timeout = Settings.Global.getLong(resolver, Settings.Global.NTP_TIMEOUT, defaultTimeout);

备份服务器

private static final String BACKUP_SERVER = "persist.backup.ntpServer";
final String sserver_prop = Settings.Global.getString(resolver, Settings.Global.NTP_SERVER_2);
final String secondServer_prop = ((null != sserver_prop)&& (0 < sserver_prop.length()))? sserver_prop : BACKUP_SERVER;
#文件路径:base/core/res/res/values/config.xml
<string translatable="false" name="config_ntpServer">time.android.com</string>
<integer name="config_ntpPollingInterval">86400000</integer>
<integer name="config_ntpPollingIntervalShorter">60000</integer>
<integer name="config_ntpRetry">3</integer>
<integer name="config_ntpThreshold">5000</integer>
<integer name="config_ntpTimeout">5000</integer>
#文件路径:base/core/java/android/provider/Settings.java
/** Preferred NTP server. {@hide} */
public static final String NTP_SERVER = "ntp_server";
/** Timeout in milliseconds to wait for NTP server. {@hide} */
public static final String NTP_TIMEOUT = "ntp_timeout";
    /** Secondary NTP server. {@hide} */
public static final String NTP_SERVER_2 = "ntp_server_2";

查看数据库如下:

msm8953_64:/ # settings get global ntp_server
null
msm8953_64:/ # settings get global ntp_timeout
null
msm8953_64:/ # settings get global ntp_server_2
persist.vendor.ntp.svr_2
msm8953_64:/ # getprop persist.vendor.ntp.svr_2
cn.ntp.org.cn
msm8953_64:/ #

更新时间三种方式:

  1. AUTO_TIME数据库字段变化,无论开关都触发
  2. 收到广播 private static final String ACTION_POLL =“com.android.server.NetworkTimeUpdateService.action.POLL”;
  3. 网络状态变化回调:NetworkCallback

修改方案:

修改默认数据库字段:AUTO_TIME 为0

base/packages/SettingsProvider/res/values/defaults.xml
<bool name="def_auto_time">false</bool>// 如果之前是true 需要升级数据库,需要小心 
//base/services/core/java/com/android/server/NewNetworkTimeUpdateService.java
private void onPollNetworkTime(int event) {
        if (!isAutomaticTimeRequested()) {
            if(DBG) Log.d(TAG,"onPollNetworkTime but auto_time is false");
            return;
}

//base/services/core/java/com/android/server/location/NtpTimeHelper.java
private boolean isAutomaticTime() {
	if (resolver != null)
	    return Settings.Global.getInt(resolver, Settings.Global.AUTO_TIME, 0) != 0;
	    return false;
	}
	
synchronized void retrieveAndInjectNtpTime()
	if (!isAutomaticTime()) {
	     if (DEBUG) Log.d(TAG, "retrieveAndInjectNtpTime but auto_time is false");
	         return;
	}

抓日志:

logcat -s SntpClient NtpTimeHelper NetworkTimeUpdateService
### Android 14 NTP 时间同步过程 在现代移动操作系统中,时间同步对于确保设备间的时间一致性至关重要。Android 设备通过网络时间协议(NTP)来保持其系统时钟的准确性。 #### 初始化阶段 当设备启动或检测到当前时间不准确时,会触发一次完整的初始化流程。在此过程中,`NetworkTimeUpdateService` 负责管理整个NTP更新周期[^1]。 ```java // Java code snippet showing part of the NetworkTimeUpdateService initialization. public class NetworkTimeUpdateService { private final Object mLock = new Object(); public void initialize() { synchronized(mLock){ // Initialization logic here... } } } ``` #### 获取服务器列表 为了提高可靠性并减少延迟,在执行实际查询之前,客户端先从预配置的一组公共NTP服务器获取可用的服务端地址池。这些信息通常存储于系统的资源文件内,并可通过OTA更新进行维护[^2]。 #### 发送请求与接收响应 一旦选择了合适的NTP服务器之后,就会向该服务器发送标准的SNTP包以请求最新时间戳。收到回复后,解析返回的数据计算偏移量以及往返延时,从而调整本地时钟设置[^3]。 ```java // Simplified representation of sending an SNTP request to a server. private void sendSntpRequest(String ntpServerAddress) throws IOException { DatagramSocket socket = null; try { InetAddress address = InetAddress.getByName(ntpServerAddress); byte[] buffer = createNtpMessage(); // Create message according to RFC 5905 DatagramPacket packetOut = new DatagramPacket(buffer, buffer.length, address, 123); // Port 123 is default for NTP service socket.send(packetOut); // Receive response from server... } finally { if (socket != null && !socket.isClosed()) { socket.close(); } } } ``` #### 更新本地时钟 完成上述步骤后,如果确认接收到有效的时间数据,则调用相应API接口修正系统时间。值得注意的是,为了避免突然改变造成应用程序逻辑混乱等问题,一般采用渐进式的微调方式而非一次性大幅跳跃[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值