Ưu tiên nguồn thời gian

Khung Android sử dụng nhiều nguồn thời gian khác nhau để đồng bộ hóa thời gian. Trang này tập trung vào các nguồn thời gian tự động Giao thức thời gian mạng (NTP) và Nhận dạng mạng và múi giờ (NITZ). Theo mặc định trong Android 12 trở lên, khung ư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 trở 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 này ưu tiên NITZ hơn NTP.

Để biết thêm 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 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 khóa config_autoTimeSourcesPriority trong frameworks/base/core/res/res/values/config.xml tại thời điểm xây dựng. Đề xuất thời gian từ nguồn thời gian cao hơn trong danh sách sẽ được ưu tiên hơn các nguồn thấp hơn trong danh sách.

Các nguồn thời gian Android có thể định cấu hình được tìm thấy trong TimeDetectorStrategy.java . Các nguồn sau đây được cấu hình để sử dụng theo mặc định:

  • Điện thoại (NITZ)
  • Mạng (NTP)

Kiểm tra

Để 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:

  1. Đảm bảo có SIM hoạt động trong DUT
  2. Tắt dữ liệu di động và Wi-Fi
  3. Đặt thiết bị ở chế độ trên máy bay để đảm bảo đã tắt sóng di động
  4. Tắt tính năng phát hiện thời gian tự động
  5. Đặt đồng hồ theo cách thủ công thành giá trị thời gian không chính xác trong tương lai
  6. Khởi động lại thiết bị
  7. Bật tính năng phát hiện thời gian tự động
  8. Đư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 đồng hồ hệ thống ngay khi nhận được tín hiệu NITZ. Để kiểm tra cách đặt thời gian của 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 có sử dụng NITZ hay không, hãy xác nhận thông tin sau trong đầu ra lệnh:

  • mEnvironment.isAutoTimeDetectionEnabled()true .
  • 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 hơn 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 gợi ý qua điện thoại.
  • Phần Telephony suggestion history chứa các gợi ý về thời gian.
  • Phần Network suggestion history trống.

Các gợi ý về thời gian trong phần Telephony suggestion historyNetwork suggestion history được coi là nguồn gốc của sự thật về thời gian. Nếu thiết bị được kết nối với Internet và có thẻ SIM, 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 thử nghiệm này, chỉ phần Telephony suggestion history chứa các đề xuất vì NTP bị tắt.

Phần Time change log ghi lại những thay đổi được thực hiện đối với đồng hồ hệ thống của thiết bị 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 khóa 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 thời gian đồng hồ hệ thống hiện tại của thiết bị trong vòng vài giây thì thời gian sẽ không bị thay đổi. Trong trường hợp thử nghiệm này, miễn là các đề xuất không bị 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 đó 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 đầu ra trong kịch bản thử nghiệm, sau đây là ví dụ về đầu ra điển hình trong đó thiết bị nhận được đề xuất về thời gian từ cả hai 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}