ลำดับความสำคัญของแหล่งที่มาของเวลา

กรอบงาน Android ใช้แหล่งเวลาที่หลากหลายสำหรับการซิงโครไนซ์เวลา หน้านี้เน้นที่แหล่งเวลาอัตโนมัติของ Network Time Protocol (NTP) และ Network Identity และ Time Zone (NITZ) โดยค่าเริ่มต้นใน Android 12 หรือสูงกว่า เฟรมเวิร์กจะจัดลำดับความสำคัญของ NTP เป็นแหล่งเวลาเหนือ NITZ เนื่องจาก NTP มีความแม่นยำและเชื่อถือได้มากกว่า NITZ ในสถานการณ์ที่ไม่มี NTP เฟรมเวิร์กจะกลับไปอยู่ที่ NITZ นี่เป็นการกลับรายการลำดับความสำคัญเริ่มต้นจากแพลตฟอร์มเวอร์ชันก่อนหน้า โดยค่าเริ่มต้นใน Android 11 และต่ำกว่า เฟรมเวิร์กจะจัดลำดับความสำคัญของ NITZ เหนือ NTP

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงนี้ โปรดดูแพตช์ AOSP ต่อไปนี้: 1563678 , 1513323

การกำหนดค่าลำดับความสำคัญของแหล่งที่มาของเวลา

ในการกำหนดค่าว่าแหล่งที่มาของเวลาใดมีลำดับความสำคัญเป็นค่าเริ่มต้นสำหรับ Android เวอร์ชันเฉพาะ ให้กำหนดค่าคีย์ config_autoTimeSourcesPriority ใน frameworks/base/core/res/res/values/config.xml ณ เวลาสร้าง คำแนะนำเวลาจากแหล่งเวลาที่สูงกว่าในรายการมีความสำคัญเหนือกว่าแหล่งที่มาที่อยู่ต่ำกว่าในรายการ

พบแหล่งที่มาของเวลา Android ที่สามารถกำหนดค่าได้ใน TimeDetectorStrategy.java แหล่งที่มาต่อไปนี้ได้รับการกำหนดค่าสำหรับการใช้งานโดยค่าเริ่มต้น:

  • โทรศัพท์ (NITZ)
  • เครือข่าย (NTP)

การทดสอบ

ในการตรวจสอบว่าอุปกรณ์ใช้ NITZ เมื่อไม่มี NTP (เมื่อข้อมูลมือถือและ Wi-Fi ถูกปิดใช้งาน) ให้ทำดังต่อไปนี้:

  1. ตรวจสอบให้แน่ใจว่ามีซิมที่ใช้งานได้ในDUT
  2. ปิดข้อมูลมือถือและ Wi-Fi
  3. ตั้งค่าอุปกรณ์เป็นโหมดเครื่องบินเพื่อให้แน่ใจว่าวิทยุมือถือปิดอยู่
  4. ปิดการตรวจจับเวลาอัตโนมัติ
  5. ตั้งนาฬิกาด้วยตนเองเป็นค่าเวลาที่ไม่ถูกต้องในอนาคต
  6. รีบูตเครื่อง
  7. เปิดการตรวจจับเวลาอัตโนมัติ
  8. นำเครื่องออกจากโหมดเครื่องบิน

ขั้นตอนเหล่านี้จะทริกเกอร์การเปลี่ยนแปลงนาฬิกาของระบบทันทีที่ได้รับสัญญาณ NITZ ในการตรวจสอบวิธีการตั้งเวลาของอุปกรณ์ ให้รันคำสั่งต่อไปนี้:

adb shell dumpsys time_detector

ในการตรวจสอบว่านาฬิกาของระบบใช้ NITZ หรือไม่ ให้ยืนยันสิ่งต่อไปนี้ในเอาต์พุตคำสั่ง:

  • mEnvironment.isAutoTimeDetectionEnabled() เป็น true
  • mEnvironment.autoOriginPriorities() มีรายการของแหล่งที่มาของเวลาที่มีแหล่งที่มาสูงกว่าในรายการซึ่งมีความสำคัญเหนือกว่าแหล่งที่มาที่ต่ำกว่าในรายการ
  • ส่วน Time change log แสดงว่านาฬิกาของระบบถูกตั้งค่าโดยใช้คำแนะนำทางโทรศัพท์
  • ส่วน Telephony suggestion history ประกอบด้วยคำแนะนำเวลา
  • ส่วน Network suggestion history ว่างเปล่า

คำแนะนำเวลาในส่วน Telephony suggestion history Network suggestion history ถือเป็นแหล่งที่มาของความจริงสำหรับเวลา หากอุปกรณ์เชื่อมต่อกับอินเทอร์เน็ตและมีซิมการ์ด คำแนะนำจะถูกสร้างขึ้นโดยใช้ทั้ง NTP (เครือข่าย) และ NITZ (โทรศัพท์) ในกรณีทดสอบนี้ เฉพาะส่วน Telephony suggestion history เท่านั้นที่มีคำแนะนำเนื่องจากปิดใช้งาน NTP

ส่วนบันทึกการ Time change log จะบันทึกการเปลี่ยนแปลงที่ทำกับนาฬิการะบบของอุปกรณ์และคำแนะนำที่ใช้ นาฬิกาของระบบถูกตั้งค่าตามลำดับของแหล่งเวลาในรายการลำดับความสำคัญในคีย์ config_autoTimeSourcesPriority อย่างไรก็ตาม ระบบอาจเพิกเฉยต่อคำแนะนำจากแหล่งที่มีลำดับความสำคัญสูงกว่าหากคำแนะนำเก่าเกินไปหรือไม่ถูกต้อง นอกจากนี้ หากคำแนะนำที่ถูกต้องที่มีลำดับความสำคัญสูงสุดตรงกับเวลานาฬิกาของระบบปัจจุบันของอุปกรณ์ภายในไม่กี่วินาที เวลาจะไม่เปลี่ยนแปลง ในกรณีทดสอบนี้ ตราบใดที่คำแนะนำไม่ล้าสมัย นาฬิกาของระบบจะถูกตั้งค่าโดยใช้หนึ่งในคำแนะนำจาก Telephony suggestion history

ต่อไปนี้คือตัวอย่างเอาต์พุตที่อุปกรณ์ใช้ NITZ อีกครั้งเมื่อ 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}

สำหรับการอ้างอิงเพื่อเปรียบเทียบกับเอาต์พุตในสถานการณ์การทดสอบ ต่อไปนี้คือตัวอย่างของเอาต์พุตทั่วไปที่อุปกรณ์ได้รับคำแนะนำเวลาจากแหล่งเวลาทั้ง NTP และ 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}