זיהוי שעון הרשת

מכשירי Android מנסים באופן אוטומטי לקבל את הזמן הנכון של ראשית זמן יוניקס ממקור ברשת. מערכת Android משתמשת בפרוטוקול SNTP, שמשתמש בפרוטוקול UDP, כדי לקבל מידע על השעה.

הרכיבים שמתוארים בדף הזה הם חלק ממערכת הזיהוי האוטומטי של השעה, שנקראת מקור השעה ברשת. אפשר להשתמש באות זמן משרת זמן ברשת כדי להגדיר את השעון של מערכת Android, אם המכשיר תומך בזיהוי זמן אוטומטי ושירות time_detector מוגדר להשתמש בו.

כברירת מחדל, מערכת Android משתמשת במקור הזמן של הרשת כמקור העיקרי לזיהוי אוטומטי של השעה.

מערכת לזיהוי זמן ברשת

שירות network_time_update_service שפועל בשרת של מערכת Android מיישם את מערכת זיהוי הזמן ברשת. השירות משתמש ב-SNTP באופן תקופתי כדי לקבל אות זמן משרת. השירות גם עוקב אחרי הקישוריות לרשת ומפעיל רענון של השעה כשאין אות זמן עדכני אחרי תקופות ארוכות של קישוריות חלשה.

שירות network_time_update_service מנסה לקבל אות זמן אחרי האתחול וכשנוצר חיבור לרשת. השירות מנסה לשמור על עדכניות האות האחרון שהוא מחזיק. הוא מאזן בין הצרכים של מכשירי Android בודדים לבין העומס המשמעותי שיכול להיווצר כתוצאה מרענון השעה על ידי מכשירי Android רבים ברחבי העולם.

באמצעות ממשקי API פנימיים, network_time_update_service שולח הצעות לזמן ברשת לשירות time_detector. רכיבים אחרים בפלטפורמת Android משתמשים בהצעות האלה לגבי שעה ברשת.

אחרי שהשירות מקבל הצעות ממקור הזמן ברשת, הוא קובע אם לעדכן את שעון המערכת בהתאם לכללי התעדוף שהוגדרו.time_detector

כדי להגדיר את המערכת לזיהוי אוטומטי של זמן כך שתשתמש בהצעות של מקור הרשת כדי להגדיר את שעון המערכת באופן אוטומטי, צריך להשתמש בקובץ ההגדרות של שרת המערכת core/res/res/values/config.xml. מוודאים שהערך network נמצא ב-config_autoTimeSourcesPriority במיקום הרצוי. פרטים נוספים זמינים במאמר בנושא עדיפות של מקורות זמן.

תצורת מכשיר

בקטע הזה מוסבר איך יצרני מכשירים יכולים להגדיר את המערכת לזיהוי זמן ברשת.

ההגדרה הבסיסית של AOSP נמצאת בכתובת frameworks/base/core/res/res/values/config.xml:

מפתח הגדרה ערך AOSP תיאור
config_ntpRetry 3 אחרי שהרענון נכשל, זה מספר הפעמים שהמערכת מנסה לבצע סקר של זמן הרשת עם אינטרוול קצר יותר של סקר NTP ‏(config_ntpPollingIntervalShorter), לפני שהיא חוזרת אחורה ומשתמשת באינטרוול הרגיל של הסקר (config_ntpPollingInterval). ערך קטן מ-0 אומר שהמערכת מנסה שוב לבצע סקר באינטרוול הקצר יותר של סקר NTP עד שהיא מצליחה לבצע רענון.
config_ntpPollingInterval 64800000 (18 שעות) מרווח הזמן הרגיל בין בדיקות הזמן ברשת באלפיות השנייה.
config_ntpPollingIntervalShorter 60000 (דקה אחת) מרווח הזמן בין בדיקות הזמן ברשת באלפיות השנייה. השדה הזה משמש כשרענון הזמן נכשל.
config_ntpServers רשומה אחת: ntp://time.android.com שרתי NTP שבהם יש להשתמש כדי לקבל זמן מדויק. הפריטים צריכים להיות בפורמט: ntp://<host>[:port].
זו לא סכימת URI רשומה של IANA.
config_ntpTimeout 5000 משך ההמתנה לתגובה משרת NTP באלפיות שנייה לפני פסק זמן.

שרתים

כברירת מחדל, מערכת AOSP משתמשת בשרתי זמן בכתובת time.android.com, שהיא כינוי ל-Google Public NTP. לשירות הזה אין הסכם SLA. פרטים נוספים זמינים בשאלות הנפוצות על Google Public NTP.

תמיכה במספר שרתים

ב-Android מגרסה 14 ואילך, המסגרת תומכת במספר שרתי NTP. התמיכה הזו שימושית במצבים שבהם המכשירים מופצים ברחבי העולם עם הגדרה יחידה, אבל הגישה לשרתים כמו time.android.com מוגבלת במקומות מסוימים.

האלגוריתם מנסה כל שרת שצוין במפתח ההגדרה config_ntpServers. כשהמערכת מוצאת שרת שמגיב, היא ממשיכה להשתמש בשרת הזה עד שהיא לא מצליחה לרענן אותו או עד שהמכשיר מופעל מחדש.

 דיוק

הסנכרון של השעה ברשת שמוגדר כברירת מחדל ב-Android משתמש ב-SNTP עם שאילתת זמן יחידה בערך פעם ביום, כדי לוודא שתמיד יש אות זמן עדכני.

ההשפעות של זמן האחזור ברשת הן הגורם העיקרי לחוסר דיוק בזמן בהטמעה של SNTP ב-Android. פרוטוקול SNTP מניח שיש עיכובים סימטריים ברשת, כלומר, זמן האחזור ברשת של הבקשה זהה לזמן האחזור ברשת של התגובה, והשעה הנכונה נמצאת בדיוק באמצע של זמן הלוך ושוב ברשת. בדרך כלל, זמן הלוך ושוב ברשת הוא בסדר גודל של כמה מאות אלפיות השנייה, וברשת קווית ההשהיה כמעט סימטרית, מה שמוביל לרמות של חוסר דיוק שכמעט לא מורגשות על ידי המשתמשים. עם זאת, בטלפוניה סלולרית או בטלפוניה רדיו יש כמה שלבים שבהם יכולים להיווצר עיכובים ארוכים יחסית ואסימטריים בעסקה ברשת, מה שמוביל לחוסר דיוק רב יותר.

בהגדרת ברירת המחדל של AOSP ל-config_ntpTimeout, שמוגדרת ל-5000מילישניות, ואם כל השהיית הרשת מרוכזת רק בקטע של התנועה הנכנסת או היוצאת, השגיאה התיאורטית המקסימלית היא בערך 2.5 שניות.

הדיוק הכולל של שעון המערכת מושפע גם מהיכולת של מכשיר Android לעקוב אחרי הזמן שחלף בצורה מדויקת אחרי קבלת אות זמן. זו בעיה שקיימת בכל שעוני Android, לא רק בזיהוי זמן ברשת, ולכן שירות time_detector מתעלם מהצעות זמן ישנות. שירות network_time_update_service מתעדכן באופן קבוע במרווח config_ntpPollingInterval כדי לספק לשירות time_detector הצעות עדכניות לזמנים, וכדי לוודא ששירות time_detector לא יחזור למקורות זמן בעלי עדיפות נמוכה יותר, שלרוב הם פחות מדויקים או שלפעמים הם שגויים, כמו telephony.

כשמשתמשים בזיהוי זמן אוטומטי, דיוק השעון של מערכת המכשיר יכול להיות מושפע מהגדרות אחרות של שירות time_detector, כמו הקבועים והדגלים שמשפיעים על מידת השוני בין הצעת זמן לבין הזמן הנוכחי בשעון המערכת, לפני שהשעון מתעדכן (ServiceConfigAccessorImpl.java).

יצרני מכשירים יכולים לשנות את רמת הדיוק באמצעות אפשרויות התצורה והקבועים שצוינו למעלה. עם זאת, חשוב להיות מודעים למגבלות של הטמעת SNTP בפלטפורמה, ולהשפעה הפוטנציאלית על צריכת החשמל כתוצאה מפעולות רשת תכופות יותר, על האפליקציות שפועלות במכשיר כתוצאה משינויים תכופים יותר אבל קטנים יותר בשעון, ועל העומס על השרת.

שימושים אחרים בשעון הרשת

אם לא מוגדר זיהוי אוטומטי של השעה באמצעות המקור network או אם המשתמש השבית את הזיהוי האוטומטי של השעה, הרכיבים הבאים עדיין משתמשים בשעה שמתקבלת מהשירות network_time_update_service:

  • השיטה SystemClock.currentNetworkTimeClock().
  • פונקציות פנימיות של הפלטפורמה. לדוגמה, מערכת A-GPS יכולה לאתר מהר יותר תיקון GNSS (מיקום) ראשון כשיש לה נתוני זמן מהרשת.

ניפוי באגים ובדיקות

בקטע הבא מתוארות פקודות shell לניפוי באגים ולבדיקה של התכונה 'זיהוי זמן ברשת'.

אינטראקציה עם השירות network_time_update_service

כדי ליצור dump של המצב הנוכחי של network_time_update_service, משתמשים בפקודה:

adb shell cmd network_time_update_service dump

כדי לראות קבוצה של אפשרויות בשורת הפקודה שיכולות לעזור בבדיקה, משתמשים בפקודה:

adb shell cmd network_time_update_service help