Khung Android sử dụng nhiều nguồn thời gian để đồng bộ hoá thời gian. Trang này tập trung vào Giao thức thời gian mạng (NTP) và Nguồn thời gian tự động Nhận dạng mạng và Múi giờ (NITZ). Theo mặc định trong Android 12 trở lên, khung sẽ ưu tiên NTP làm nguồn thời gian hơn NITZ vì NTP chính xác và đáng tin cậy hơn NITZ. Trong trường hợp không có NTP, khung sẽ quay lại NITZ. Đây là sự đảo ngược mức độ ưu tiên mặc định so với các phiên bản trước của nền tảng. Theo mặc định trong Android 11 trở xuống, khung sẽ ưu tiên NITZ hơn NTP.
Để biết thêm thông tin về thay đổi này, hãy xem các bản vá AOSP sau đây: 1563678, 1513323.
Định cấu hình mức độ ưu tiên của nguồn thời gian
Để định cấu hình nguồn thời gian nào được ưu tiên theo mặc định cho một phiên bản Android cụ thể, hãy định cấu hình khoá config_autoTimeSourcesPriority
trong frameworks/base/core/res/res/values/config.xml
tại thời điểm tạo bản dựng. Đề xuất về thời gian từ nguồn thời gian có thứ hạng cao hơn trong danh sách sẽ được ưu tiên hơn các nguồn có thứ hạng thấp hơn trong danh sách.
Bạn có thể tìm thấy các nguồn thời gian của Android mà bạn có thể định cấu hình trong TimeDetectorStrategy.java
.
Theo mặc định, các nguồn sau đây được định cấu hình để sử dụng:
- Điện thoại (NITZ)
- Mạng (NTP)
Thử nghiệm
Để xác minh rằng thiết bị sử dụng NITZ khi không có NTP (khi dữ liệu di động và Wi-Fi bị tắt), hãy làm như sau:
- Đảm bảo DUT có một SIM đang hoạt động
- Tắt dữ liệu di động và Wi-Fi
- Đặt thiết bị ở chế độ trên máy bay để đảm bảo rằng đài di động đã tắt
- Tắt tính năng tự động phát hiện thời gian
- Đặt đồng hồ theo cách thủ công thành một giá trị thời gian không chính xác trong tương lai
- Khởi động lại thiết bị
- Bật tính năng tự động phát hiện thời gian
- Tắt chế độ trên máy bay
Các bước này sẽ kích hoạt thay đổi đối với đồng hồ hệ thống ngay khi nhận được tín hiệu NITZ. Để kiểm tra cách thiết lập thời gian trên thiết bị, hãy chạy lệnh sau:
adb shell dumpsys time_detector
Để xác minh rằng đồng hồ hệ thống sử dụng NITZ, hãy xác nhận những thông tin sau trong đầu ra lệnh:
mEnvironment.isAutoTimeDetectionEnabled()
ở trạng tháitrue
.mEnvironment.autoOriginPriorities()
chứa danh sách các nguồn thời gian, trong đó các nguồn ở vị trí cao hơn trong danh sách sẽ được ưu tiên hơn các nguồn ở vị trí thấp hơn trong danh sách.- Phần
Time change log
cho biết đồng hồ hệ thống được đặt bằng đề xuất của dịch vụ điện thoại. - Mục
Telephony suggestion history
chứa các đề xuất về thời gian. - Mục
Network suggestion history
đang trống.
Các đề xuất về thời gian trong phần Telephony suggestion history
và Network suggestion history
được coi là nguồn thông tin đáng tin cậy về thời gian. Nếu thiết bị được kết nối với Internet và có thẻ SIM, thì các đề xuất sẽ được tạo bằng cả NTP (mạng) và NITZ (điện thoại). Trong trường hợp kiểm thử này, chỉ phần Telephony suggestion history
chứa các đề xuất vì NTP bị vô hiệu hoá.
Mục Time change log
ghi lại những thay đổi đối với đồng hồ hệ thống của thiết bị và đề xuất được sử dụng. Đồng hồ hệ thống được đặt dựa trên thứ tự của các nguồn thời gian trong danh sách ưu tiên trong khoá config_autoTimeSourcesPriority
. Tuy nhiên, các đề xuất từ nguồn có mức độ ưu tiên cao hơn có thể bị bỏ qua nếu đề xuất quá cũ hoặc không hợp lệ.
Ngoài ra, nếu đề xuất hợp lệ có mức độ ưu tiên cao nhất khớp với thời gian hiện tại của đồng hồ hệ thống trên thiết bị trong vòng vài giây, thì thời gian sẽ không thay đổi.
Trong trường hợp kiểm thử này, miễn là các đề xuất không lỗi thời, đồng hồ hệ thống sẽ được đặt bằng một trong các đề xuất từ Telephony suggestion history
.
Sau đây là ví dụ về đầu ra trong trường hợp thiết bị quay lại sử dụng NITZ khi không có NTP.
TimeDetectorStrategy:
mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
mEnvironment.isAutoTimeDetectionEnabled()=true
mEnvironment.elapsedRealtimeMillis()=73059
mEnvironment.systemClockMillis()=1614186767818
mEnvironment.systemClockUpdateThresholdMillis()=2000
mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
mEnvironment.autoOriginPriorities()=[network,telephony]
Time change log:
66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
Telephony suggestion history:
key idx: 0=0
val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
Historic values=[
0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
]
Network suggestion history:
{Empty}
Gnss suggestion history:
{Empty}
External suggestion history:
{Empty}
Để tham khảo khi so sánh với kết quả đầu ra trong tình huống kiểm thử, sau đây là ví dụ về kết quả đầu ra điển hình khi thiết bị nhận được đề xuất về thời gian từ cả nguồn thời gian NTP và NITZ.
TimeDetectorStrategy:
mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
mEnvironment.isAutoTimeDetectionEnabled()=true
mEnvironment.elapsedRealtimeMillis()=302926
mEnvironment.systemClockMillis()=1614186997685
mEnvironment.systemClockUpdateThresholdMillis()=2000
mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
mEnvironment.autoOriginPriorities()=[network,telephony]
Time change log:
66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
Telephony suggestion history:
key idx: 0=0
val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
Historic values=[
0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
]
Network suggestion history:
0@PT4M4.04S: NetworkTimeSuggestion{mUtcTime=TimestampedValue{mReferenceTimeMillis=244038, mValue=1614186939242}, mDebugInfo=[Origin: NetworkTimeUpdateService. event=3]}
Gnss suggestion history:
{Empty}
External suggestion history:
{Empty}