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 này ưu tiên NTP làm nguồn thời gian hơn NITZ vì NTP là chính xác và đáng tin cậy hơn NITZ. Trong trường hợp không có NTP, khung này sẽ sử dụng NITZ. Đây là sự đảo ngược mức độ ưu tiên mặc định từ các phiên bản trước đó của chủ. Theo mặc định trong Android 11 trở xuống, khung này sẽ ưu tiên NITZ trên NTP.
Để biết thêm thông tin chi tiết về thay đổi này, hãy xem các bản vá AOSP sau: 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 được ưu tiên theo mặc định cho một thiết bị Android cụ thể
phiên bản, hãy định cấu hình
config_autoTimeSourcesPriority
khoá trong frameworks/base/core/res/res/values/config.xml
khi tạo bản dựng. Thời gian
các đề xuất từ nguồn thời gian cao hơn trong danh sách sẽ được ưu tiên
trên các nguồn thấp hơn trong danh sách.
Bạn có thể tìm thấy các nguồn thời gian Android có thể định cấu hình trong
TimeDetectorStrategy.java
.
Các nguồn sau đây được định cấu hình để sử dụng theo mặc định:
- Đ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 có SIM đang hoạt động trong DUT
- Tắt dữ liệu di động và Wi-Fi
- Đặt thiết bị ở chế độ trên máy bay để đảm bảo đã tắt radio di động
- 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
- Đưa thiết bị ra khỏi 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 NITZ đã nhận được tín hiệu. Để kiểm tra cách đặt thời gian trên thiết bị, hãy chạy lệnh sau :
adb shell dumpsys time_detector
Để xác minh đồng hồ hệ thống sử dụng NITZ, hãy xác nhận nội dung sau trong lệnh đầu ra:
mEnvironment.isAutoTimeDetectionEnabled()
ở trạng tháitrue
.mEnvironment.autoOriginPriorities()
chứa danh sách các nguồn thời gian với các nguồn cao hơn trong danh sách được ưu tiên so với các nguồn thấp hơn trong danh sách.- Phần
Time change log
cho thấy đồng hồ hệ thống được đặt bằng cách sử dụng số điện thoại đề xuất. - Phần
Telephony suggestion history
có đề xuất về thời gian. - Phần
Network suggestion history
trống.
Các đề xuất về thời gian trong Telephony suggestion history
và
Các phần Network suggestion history
được xem là nguồn đáng tin cậy cho
bất cứ lúc nào. Các đề xuất nếu thiết bị có kết nối Internet và có thẻ SIM
đượ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 đề xuất bởi vì
NTP đã bị tắt.
Phần Time change log
ghi lại các thay đổi đối với thiết bị
đồng hồ hệ thống và gợi ý đượ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, đề 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 đề xuất hiện tại của thiết bị
thời gian theo đồng hồ hệ thống thành khoả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
được đặt bằng một trong các đề xuất của Telephony suggestion history
.
Sau đây là ví dụ về một dữ liệu đầu ra mà thiết bị quay lại sử dụng NITZ khi NTP không khả dụng.
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ả trong tình huống kiểm thử, sau đây là ví dụ về một đầu ra thông thường trong đó 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}