מכשירי Android מנסים באופן אוטומטי לקבל את זמן ה-Unix epoch הנכון מ- מקור רשת. 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 URI. |
config_ntpTimeout |
5000 | זמן המתנה לתגובת שרת NTP באלפיות שנייה לפני זמן קצוב לתפוגה. |
שרתים
כברירת מחדל, AOSP משתמש בשרתי זמן ב-time.android.com
, שהוא כינוי של
ה-NTP הציבורי של Google. לשירות הזה יש
אין הסכם רמת שירות. פרטים נוספים זמינים במאמר
שאלות נפוצות על ה-NTP הציבורי של Google.
תמיכה במספר שרתים
ב-Android מגרסה 14 ואילך, ה-framework תומך
שרתי 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 (מיקום) קודם יתוקן מהר יותר כשיש לו מידע על זמן הרשת.
ניפוי באגים ובדיקה
הקטע הבא מתאר פקודות מעטפת לניפוי באגים ולבדיקת תכונת זיהוי זמן הרשת.
אינטראקציה עם השירות network_time_update_service
כדי להעלות את המצב הנוכחי של network_time_update_service
, משתמשים ב:
adb shell cmd network_time_update_service dump
כדי לראות קבוצת אפשרויות של שורת הפקודה שיכולות לעזור בבדיקה, אפשר להשתמש ב:
adb shell cmd network_time_update_service help