עדיפות מקור זמן

מסגרת אנדרואיד משתמשת במקורות זמן שונים לסנכרון זמן. דף זה מתמקד במקורות הזמן האוטומטיים של Network Time Protocol (NTP) ו-Network Identity and Zone Time (NITZ). כברירת מחדל באנדרואיד 12 ומעלה, המסגרת נותנת עדיפות ל-NTP כמקור הזמן על פני NITZ מכיוון ש-NTP מדויק ואמין יותר מ-NITZ. במצבים שבהם NTP אינו זמין, המסגרת נופלת על NITZ. זהו היפוך של עדיפות ברירת המחדל מגרסאות קודמות של הפלטפורמה. כברירת מחדל באנדרואיד 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. ודא שיש SIM עובד ב-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 נחשבות למקור האמת לזמן. אם המכשיר מחובר לאינטרנט ויש לו כרטיס SIM, הצעות נוצרות גם באמצעות 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}