מכשירי Android מנסים באופן אוטומטי לקבל את הזמן הנכון של ראשית זמן יוניקס ממקור ברשת. מערכת 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 ), לפני שהיא חוזרת אחורה ומשתמשת באינטרוול הרגיל של הסקר (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