זיהוי זמן רשת

מכשירי 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.
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