זיהוי אזור הזמן של הטלפוניה

במכשירים עם Android מגרסה 11 ומטה, זיהוי אוטומטי של אזור הזמן ב-AOSP מבוסס על אותות מהתת-מערכת של הטלפון. בגלל התלות במערכת המשנית של הטלפון, זיהוי אוטומטי של אזור זמן ב-Android 11 וגרסאות קודמות מוגבל למכשירי טלפון.

כשהתכונה 'זיהוי אזור זמן של טלפוניה' זמינה, היא פועלת באמצעות האותות Mobile Country Code‏ (MCC) ו-Network Identity and Time Zone‏ (NITZ).

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

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

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

הגבלה של זיהוי אזור הזמן של הטלפוניה

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

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

בטבלה הבאה מפורטת התנהגות המכשיר בהתאם לעונה, לדוגמה בדנוור ובפיניקס:

מיקום ועונה מידע מחשבון הניהול או מ-NITZ אזור הזמן וההתנהגות שזוהו
דנוור, קולורדו
חורף
שעה: 1 בינואר 2021 12:00:00
מדינה: ארה"ב
היסט: UTC-7, אין שעון קיץ
שני מזהי תחומים תואמים:
  • America/Denver
  • America/Phoenix

המכשיר מוגדר בצורה נכונה ל-America/Denver.
פיניקס, אריזונה
חורף
זמן: 1 בינואר 2021 12:00:00
מדינה: ארה"ב
הפרש: UTC-7, ללא שעון קיץ
שני מזהי תחומים תואמים:
  • America/Denver
  • אמריקה/פניקס

המכשיר מוגדר שגוי ל-America/Denver.
דנוור, קולורדו
קיץ
שעה: 1 ביולי 2021 12:00:00
מדינה: ארה"ב
היסט: UTC-6, שעון קיץ
מזהה תחום אחד תואם:
  • America/Denver

המכשיר מוגדר בצורה נכונה כ-אמריקה/דנבר.
פיניקס, אריזונה
קיץ
זמן: 1 ביולי 2021 12:00:00
מדינה: ארה"ב
הפרש: UTC-7, ללא שעון קיץ
מזהה אזור אחד תואם:
  • America/Phoenix

המכשיר מוגדר בצורה נכונה בתור America/Phoenix.

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

עם זאת, באביב, כשבדנוור יש שעון קיץ ובפיניקס אין, במכשירים מסוימים עשויה להופיע באופן זמני השעה המקומית הלא נכונה אם הם מוגדרים למזהה אזור הזמן הלא נכון למיקום של המשתמש. השגיאה מתוקנת ברגע שהמכשיר מקבל אות NITZ חדש (במיוחד אות שמכיל את פרטי ההיסט 'UTC-7, no daylight savings'), אבל התהליך הזה עשוי להימשך זמן מה והוא תלוי בספקים.

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

ניפוי באגים ובדיקה

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

הגדרת סביבת הבדיקה

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

כדי שהמכשיר יזהה את אזור הזמן, פרטי האות של NITZ חייבים להיות נכונים, תואמים ל-MCC ותואמים לעותק של IANA TZDB (כללי אזור הזמן) במכשיר. אותות NITZ שאינם עקביים עם ה-MCC גורמים לאלגוריתם הטלפוני להיות לא בטוח.

לדוגמה, אם ה-MCC שבו נעשה שימוש בתא הבדיקה הוא של ארה"ב, אות ה-NITZ חייב לכלול את 'השעה האוניברסלית', את הפרש השעות ואת פרטי שעון הקיץ התקפים לאזור כלשהו בארה"ב.

אינטראקציה עם השירות com.android.phone

כדי לוודא שהמכשיר מקבל הצעות נכונות לאזור הזמן של טלפוניה, צריך להשתמש ב-:

adb shell dumpsys activity service \
    com.android.phone/com.android.phone.TelephonyDebugService

הפקודה הזו מפיקה נתוני טלפוניה, שאפשר למצוא גם בדוחות הבאגים של 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")]}