מסגרת אנדרואיד משתמשת במקורות זמן שונים לסנכרון זמן. דף זה מתמקד במקורות הזמן האוטומטיים של 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 מושבתים), בצע את הפעולות הבאות:
- ודא שיש SIM עובד ב-DUT
- כבה נתונים סלולריים ו-Wi-Fi
- הכנס את המכשיר למצב טיסה כדי לוודא שהרדיו הסלולרי כבוי
- כבה את זיהוי הזמן האוטומטי
- הגדר את השעון ידנית לערך זמן שגוי בעתיד
- הפעל מחדש את המכשיר
- הפעל את זיהוי הזמן האוטומטי
- הוצא את המכשיר ממצב טיסה
שלבים אלה מפעילים שינוי בשעון המערכת ברגע שמתקבל אות 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}