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

מכשירי Android מנסים באופן אוטומטי לקבל את הזמן הנכון בפורמט Unix epoch ממקור ברשת. מערכת Android משתמשת בפרוטוקול Simple Network Time Protocol ‏ (SNTP), שמשתמש בפרוטוקול User Datagram Protocol ‏ (UDP), כדי לקבל מידע על השעה.

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

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

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

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

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

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

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

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

תצורת מכשיר

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

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

מפתח הגדרה ערך AOSP תיאור
config_ntpRetry 3 אחרי שהרענון נכשל, זה מספר הפעמים שהמערכת מנסה לבצע סקר של זמן הרשת עם מרווח קצר יותר בין סקרי NTP ‏(config_ntpPollingIntervalShorter), לפני שהיא חוזרת אחורה ומשתמשת במרווח הרגיל בין סקרי NTP ‏ (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