במכשירים עם Android מגרסה 11 ומטה, זיהוי אוטומטי של אזור הזמן ב-AOSP מבוסס על אותות מהתת-מערכת של הטלפון. בגלל התלות במערכת המשנית של הטלפון, זיהוי אוטומטי של אזור זמן ב-Android 11 וגרסאות קודמות מוגבל למכשירי טלפון.
כשהתכונה 'זיהוי אזור זמן של טלפוניה' זמינה, היא פועלת באמצעות האותות Mobile Country Code (MCC) ו-Network Identity and Time Zone (NITZ).
לדוגמה, מכשיר בצרפת יכול לזהות את אזור הזמן על סמך ה-MCC שמדווח על ידי תורני הסלולר בקרבת מקום בלבד. הסיבה לכך היא שבצרפת נהוג להשתמש באזור זמן אחד.
כשמדינה משתמשת בכמה אזורי זמן, ה-MCC לבדו לא מספיק כדי לזהות את אזור הזמן. במדינות האלה, המכשיר משתמש גם באותות NITZ כדי לזהות את אזור הזמן הנכון. השיטה הזו עובדת היטב במקומות רבים בעולם, אבל היא דורשת שאותות NITZ יהיו זמינים ונכונים, ולכן היא תלויה בחברות הסלולר.
זיהוי אזור הזמן של טלפוניה הוא גלאי פסיבי. הוא פועל כל הזמן, ולכן הצעות לשימוש בטלפון מתקבלות לעיתים קרובות גם כשהאלגוריתם הפעיל של time_zone_detector
הוא לא טלפוניה.
הגבלה על זיהוי אזור הזמן של שיחות טלפון
גם אם יש אותות NITZ נכונים, זיהוי אזור הזמן של הטלפון לא תמיד פועל טוב בכל מדינה. הסיבה לכך היא ש-Nitz מכיל רק מידע על הפרש השעות ועל שעון הקיץ, שלא תמיד מספיקים כדי לזהות באופן ייחודי תחום זמן.
יש הרבה מקומות בעולם שבהם יכולה להתרחש הבעיה הזו של אזור הזמן. לדוגמה, אי אפשר להבדיל בין דנוור בקולורדו לבין פיניקס באריזונה בארה"ב באמצעות אותות NITZ בחורף, אבל אפשר להבדיל ביניהם בעונות אחרות. בעיה כזו עשויה להתרחש בכל מיקום עם אזורי זמן חופפים דומים.
בטבלה הבאה מפורטת התנהגות המכשיר בהתאם לעונה, לדוגמה בדנוור ובפיניקס:
מיקום ועונה | מידע מ-MCC או מ-NITZ | אזור הזמן וההתנהגות שזוהו |
---|---|---|
דנוור, קולורדו חורף |
זמן: 1 בינואר 2021 12:00:00 מדינה: ארה"ב הפרש שעון: UTC-7, ללא שעון קיץ |
שני מזהי תחומים תואמים:
המכשיר מוגדר בצורה נכונה ל-America/Denver. |
פיניקס, אריזונה חורף |
זמן: 1 בינואר 2021 12:00:00 מדינה: ארה"ב הפרש שעון: UTC-7, ללא שעון קיץ |
שני מזהי תחומים תואמים:
המכשיר מוגדר באופן שגוי ל-America/Denver. |
דנוור, קולורדו קיץ |
זמן: 1 ביולי 2021 12:00:00 מדינה: ארה"ב הפרש: UTC-6, שעון קיץ |
מזהה תחום אחד תואם:
המכשיר מוגדר בצורה נכונה ל-America/Denver. |
פיניקס, אריזונה קיץ |
זמן: 1 ביולי 2021 12:00:00 מדינה: ארה"ב הפרש: UTC-7, ללא שעון קיץ |
מזהה תחום אחד תואם:
המכשיר מוגדר בצורה נכונה ל-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")]}