android8.x 连接网络无法自动更新时间

android通过访问NTP服务器来更新系统时间,代码位于:
frameworks/base/services/core/java/com/android/server/NetworkTimeUpdateService.java

***//连接网络和打开设置中的自动更新时间都会调用如下方法,来获取时间***
    private void onPollNetworkTime(int event) {
        // If Automatic time is not set, don't bother. Similarly, if we don't
        // have any default network, don't bother.
        if (!isAutomaticTimeRequested() || mDefaultNetwork == null) return;
        mWakeLock.acquire();
        try {
            onPollNetworkTimeUnderWakeLock(event);
        } finally {
            mWakeLock.release();
        }
    }

private void onPollNetworkTimeUnderWakeLock(int event) {
    final long refTime = SystemClock.elapsedRealtime();
    // If NITZ time was received less than mPollingIntervalMs time ago,
    // no need to sync to NTP.
    if (mNitzTimeSetTime != NOT_SET && refTime - mNitzTimeSetTime < mPollingIntervalMs) {
        resetAlarm(mPollingIntervalMs);
        return;
    }
    final long currentTime = System.currentTimeMillis();
    if (DBG) Log.d(TAG, "System time = " + currentTime);
    // Get the NTP time
    if (mLastNtpFetchTime == NOT_SET || refTime >= mLastNtpFetchTime + mPollingIntervalMs
            || event == EVENT_AUTO_TIME_CHANGED) {
        if (DBG) Log.d(TAG, "Before Ntp fetch");

        // force refresh NTP cache when outdated
        if (mTime.getCacheAge() >= mPollingIntervalMs) {
            mTime.forceRefresh();
        }

		**//如果NTP服务器不可用,此条件不成立**
        // only update when NTP time is fresh
        if (mTime.getCacheAge() < mPollingIntervalMs) {
            final long ntp = mTime.currentTimeMillis();
            mTryAgainCounter = 0;
            // If the clock is more than N seconds off or this is the first time it's been
            // fetched since boot, set the current time.
            if (Math.abs(ntp - currentTime) > mTimeErrorThresholdMs
                    || mLastNtpFetchTime == NOT_SET) {
                // Set the system time
                if (DBG && mLastNtpFetchTime == NOT_SET
                        && Math.abs(ntp - currentTime) <= mTimeErrorThresholdMs) {
                    Log.d(TAG, "For initial setup, rtc = " + currentTime);
                }
                if (DBG) Log.d(TAG, "Ntp time to be set = " + ntp);
                // Make sure we don't overflow, since it's going to be converted to an int
                if (ntp / 1000 < Integer.MAX_VALUE) {
                    SystemClock.setCurrentTimeMillis(ntp);
                }
            } else {
                if (DBG) Log.d(TAG, "Ntp time is close enough = " + ntp);
            }
            mLastNtpFetchTime = SystemClock.elapsedRealtime();
        } else {
            // Try again shortly
            mTryAgainCounter++;
            if (mTryAgainTimesMax < 0 || mTryAgainCounter <= mTryAgainTimesMax) {
                resetAlarm(mPollingIntervalShorterMs);
            } else {
                // Try much later
                mTryAgainCounter = 0;
                resetAlarm(mPollingIntervalMs);
            }
            return;
        }
    }
    resetAlarm(mPollingIntervalMs);
}

修改默认的ntp服务器地址
frameworks/base/core/res/res/values/config.xml

<string translatable="false" name="config_ntpServer">time.android.com</string>
<string translatable="false" name="config_ntpServer">ntp1.aliyun.com</string>

和网络相关的信息在下列文件信息中:
frameworks/base/core/java/android/util/NtpTrustedTime.java

public static synchronized NtpTrustedTime getInstance(Context context) {
    if (sSingleton == null) {
        final Resources res = context.getResources();
        final ContentResolver resolver = context.getContentResolver();

        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);

    final String server = secureServer != null ? secureServer : defaultServer;
    sSingleton = new NtpTrustedTime(server, timeout);
    sContext = context;

    if (null != sSingleton) {
        final String backupServer = SystemProperties.get("persist.backup.ntpServer");

        sSingleton.mNtpRetriesMax = res.getInteger(
            com.android.internal.R.integer.config_ntpRetry);

        if ((0 < sSingleton.mNtpRetriesMax) &&
            (null != backupServer) &&
            (0 != backupServer.length())) {
            sSingleton.mBackupServer = (backupServer.trim()).replace("\"", "");
        } else {
            sSingleton.mNtpRetriesMax = 0;
            sSingleton.mBackupServer = "";
        }
        }
    }

    return sSingleton;
}

可以添加备份ntp服务器地址(防止默认地址无法访问时,导致时间更新失败)
persist.backup.ntpServer=0.cn.pool.ntp.org

上面这两个地址都是在baidu搜索到的,只要验证能ping同就可以

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值