זיהוי זמן רשת

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

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

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

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

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

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

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

לאחר קבלת הצעות ממקור הזמן ברשת, שירות 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] .
זו אינה סכימת IANA URI רשומה.
config_ntpTimeout 5000 זמן לחכות לתגובת שרת NTP באלפיות שניות לפני הזמן הקצוב.

שרתים

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

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

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

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

דיוק

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

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

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

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