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

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

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

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

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

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

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

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

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

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

מיקום ועונה מידע מחשבון ניהול (MCC) או מ-NITZ אזור הזמן וההתנהגות שזוהו
דנבר, קולורדו
חורף
תאריך: 1 בינואר 2021 12:00:00
מדינה: US
היסט: UTC-7, ללא שעון קיץ
שני מזהי אזורים תואמים:
  • אמריקה/דנוור
  • אמריקה/פניקס

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

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

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

המכשיר מוגדר בצורה נכונה כ'אמריקה/פיניקס'.

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

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

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

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

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

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

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

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

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

אינטראקציה עם השירות 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")]}