במכשירים עם Android בגרסה 11 או גרסאות מוקדמות יותר, זיהוי אוטומטי של אזור זמן ב-AOSP מסתמך על אותות ממערכת המשנה של הטלפוניה. בגלל התלות במערכת המשנה של הטלפוניה, זיהוי אוטומטי של אזור זמן ב-Android 11 או בגרסאות קודמות מוגבל למכשירי טלפוניה.
אם זיהוי אזור הזמן בטלפוניה זמין, הוא פועל באמצעות קוד המדינה לנייד (MCC) ואותות זיהוי הרשת ואזור הזמן (NITZ).
לדוגמה, מכשיר בבלגיה יכול לזהות את אזור הזמן על סמך קוד המדינה (MCC) שמדווח על ידי אנטנות סלולריות בקרבת מקום. הדבר אפשרי כי ידוע שבבלגיה משתמשים באזור זמן יחיד.
כשמדינה מסוימת משתמשת בכמה אזורי זמן, קוד המדינה לנייד (MCC) לבדו לא מספיק כדי לזהות את אזור הזמן. במדינות האלה, המכשיר משתמש גם באותות NITZ כדי לזהות את אזור הזמן הנכון. השיטה הזו עובדת טוב בהרבה מקומות בעולם, אבל היא דורשת שאותות NITZ יהיו זמינים ונכונים, ולכן היא תלויה בספקי הסלולר.
זיהוי אזור הזמן בטלפוניה הוא מזהה פסיבי. הוא פועל כל הזמן, ולכן ההצעות לשיחות טלפון מוצגות לעיתים קרובות גם כשהאלגוריתם הפעיל time_zone_detector
לא מתמקד כרגע בשיחות טלפון.
מגבלה בזיהוי אזור הזמן בטלפוניה
גם אם יש אותות NITZ תקינים, זיהוי אזור הזמן בטלפוניה לא תמיד פועל בצורה טובה בכל מדינה. הסיבה לכך היא ש-NITZ מכיל רק מידע על הפרש השעות ועל שעון הקיץ, שלא תמיד מספיק כדי לזהות אזור זמן באופן ייחודי.
יש הרבה מקומות בעולם שבהם יכולה להתרחש בעיה כזו של אזור זמן. לדוגמה, אי אפשר להבחין בין דנוור שבקולורדו לבין פיניקס שבאריזונה בארה"ב באמצעות אותות NITZ במהלך החורף, אבל אפשר להבחין ביניהן בעונות אחרות. בעיות כאלה יכולות לקרות בכל מיקום שבו יש חפיפה דומה בין אזורי הזמן.
בטבלה הבאה מפורטת התנהגות המכשיר בהתאם לעונה בדנוור ובפיניקס לדוגמה:
מיקום ועונה | מידע מ-MCC או מ-NITZ | אזור הזמן וההתנהגות שזוהו |
---|---|---|
Denver, Colorado Winter |
שעה: 1 בינואר 2021, 12:00:00 מדינה: ארה"ב הפרש: UTC-7, ללא שעון קיץ |
שני מזהי אזורים זהים:
המכשיר מוגדר נכון לאזור הזמן America/Denver. |
פיניקס, אריזונה חורף |
שעה: 1 בינואר 2021, 12:00:00 מדינה: ארה"ב הפרש: UTC-7, ללא שעון קיץ |
שני מזהי אזורים זהים:
המכשיר מוגדר באופן שגוי לאזור הזמן America/Denver. |
Denver, Colorado Summer |
השעה: 1 ביולי 2021, 12:00:00 המדינה: ארה"ב ההפרש: UTC-6, שעון קיץ |
מזהה אזור אחד תואם:
המכשיר מוגדר נכון לאזור הזמן America/Denver. |
פיניקס, אריזונה קיץ |
השעה: 1 ביולי 2021, 12:00:00 המדינה: ארה"ב ההפרש: UTC-7, ללא שעון קיץ |
מזהה אזור אחד תואם:
המכשיר מוגדר נכון לאזור הזמן America/Phoenix. |
הדוגמאות בטבלה מראות שבמהלך החורף, מכשירי Android בדנוור או באריזונה צריכים לבחור אחד משני מזהי אזור זמן תואמים, שיכול להיות שיהיה שגוי בחלק מהמכשירים, אבל עדיין יוצג זמן מקומי שנראה נכון. השעון, היומנים ואפליקציות אחרות במכשיר מציגים את השעה המקומית הצפויה גם אם מזהה אזור הזמן שגוי, כי שני מזהי אזור הזמן מחשבים את אותה שעה מקומית במהלך החורף.
עם זאת, באביב, כשבדנוור יש שעון קיץ ובפיניקס אין, יכול להיות שבמכשירים מסוימים תוצג באופן זמני השעה המקומית הלא נכונה אם הם מוגדרים למזהה אזור זמן שגוי למיקום של המשתמש. השעה תתוקן ברגע שהמכשיר יקבל אות NITZ חדש (במיוחד, אות שמכיל מידע על היסט של UTC-7, ללא שעון קיץ), אבל זה יכול לקחת זמן ותלוי בספקי הסלולר.
כתוצאה מכך, יכול להיות שיוצג זמן מקומי שגוי בלוחות שנה או באפליקציות אחרות שמאחסנות או מעבירות את מזהה אזור הזמן מהחורף לאביב, עד שהאפליקציות הרלוונטיות יעודכנו עם מזהה אזור הזמן הנכון.
ניפוי באגים ובדיקות
בקטע הבא מתוארות פקודות של מעטפת לניפוי באגים ולבדיקה של התכונה לזיהוי אזור זמן בטלפוניה.
הגדרת סביבת בדיקה
בודקים בדרך כלל משתמשים בסביבת בדיקה עם תא טלפוניה לבדיקה או לסימולציה כדי לבדוק את התנהגות זיהוי אזור הזמן בטלפוניה. אפשר להשתמש בתא הבדיקה כדי לדמות רשתות עם קודי מדינה שונים, לשלוח אותות NITZ למכשירים ולעקוב אחרי ההשפעות שלהם.
כדי שהמכשיר יזהה את אזור הזמן, נתוני האות של NITZ צריכים להיות נכונים, עקביים עם קוד המדינה (MCC) ותואמים לעותק של TZDB (time zone rules) של IANA במכשיר. אותות NITZ שלא עקביים עם קוד המדינה (MCC) גורמים לאלגוריתם הטלפוניה להיות לא ודאי.
לדוגמה, אם חשבון הניהול שבו נעשה שימוש בתא הבדיקה הוא בארה"ב, אות ה-NITZ צריך להכיל UTC, היסט ופרטים על שעון קיץ שמתאימים למקום כלשהו בארה"ב.
יצירת אינטראקציה עם השירות com.android.phone
כדי לוודא שהמכשיר מקבל הצעות נכונות לאזור זמן טלפוני, משתמשים בפקודה:
adb shell dumpsys activity service \
com.android.phone/com.android.phone.TelephonyDebugService
הפעולה הזו יוצרת קובץ dump של מידע על הטלפוניה, שאפשר למצוא גם בדוחות על באגים ב-Android. במכשירים עם כמה כרטיסי SIM, מוצג מידע על כל רדיו SIM.
ביומני אזור הזמן מוצגות ההצעות שתהליך הטלפוניה שלח ל-time_zone_detector והסיבות לשליחת ההצעות.
TimeServiceHelperImpl: SystemClock.elapsedRealtime()=11864061 System.currentTimeMillis()=1620652067178 Time Logs: ... Time zone Logs: 18602 / 2021-05-10T09:50:21.718Z - Suggesting time zone update: TelephonyTimeZoneSuggestion{mSlotIndex=0, mZoneId='null', mMatchType=0, mQuality=0, mDebugInfo=[getTimeZoneSuggestion: nitzSignal=TimestampedValue{mReferenceTimeMillis=14098, mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000, mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}}, countryIsoCode=null, Detection reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=14098, mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000, mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}})]} 18831 / 2021-05-10T09:50:21.948Z - Suggesting time zone update: TelephonyTimeZoneSuggestion{mSlotIndex=0, mZoneId='Europe/London', mMatchType=3, mQuality=1, mDebugInfo=[findTimeZoneFromCountryAndNitz: countryIsoCode=gb, nitzSignal=TimestampedValue{mReferenceTimeMillis=14098, mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000, mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}}, findTimeZoneFromCountryAndNitz: lookupResult=OffsetResult{mTimeZone(ID)=Europe/London, mIsOnlyMatch=true}, Detection reason=handleCountryDetected("gb")]}