המערכת של Android משתמשת במקורות זמן שונים לסנכרון זמן. הדף הזה מתמקד בפרוטוקול זמן הרשת (NTP) מקורות זמן אוטומטיים של זהות רשת ואזור זמן (NITZ). כברירת מחדל ב-Android מגרסה 12 ואילך, מסגרת מתעדפת את NTP כמקור הזמן על פני NITZ, כי מדויק ואמין יותר מ-NITZ. במצבים שבהם NTP לא זמין, ה-framework חוזר על עצמו ב-NITZ. זוהי ביטול של עדיפות ברירת המחדל מגרסאות קודמות של הפלטפורמה. כברירת מחדל ב-Android מגרסה 11 ומטה, המסגרת מתעדפת את NITZ מעל NTP.
פרטים נוספים על השינוי הזה זמינים בתיקונים הבאים של AOSP: 1563678, 1513323.
הגדרת העדיפות של מקור הזמן
כדי להגדיר איזה מקור זמן יקבל עדיפות כברירת מחדל במכשיר Android ספציפי
גרסה, להגדיר
config_autoTimeSourcesPriority
ב-frameworks/base/core/res/res/values/config.xml
בזמן ה-build. השעה
הצעות ממקור הזמן שנמצא במיקום גבוה יותר ברשימה מקבלות עדיפות
לעומת מקורות שנמוכים יותר ברשימה.
מקורות הזמן של 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}