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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

איתור באגים ובדיקה

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

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

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

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

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

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

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

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

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