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

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

כאשר זיהוי אזור זמן טלפוניה זמין, הוא פועל באמצעות אותות קוד מדינה נייד (MCC) ורשת זהות ואזור זמן (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")]}