Telefonie-Zeitzonenerkennung

Bei Geräten mit Android 11 oder niedriger ist die automatische Zeitzonenerkennung im AOSP auf Signale vom Telefonie-Subsystem angewiesen. Aufgrund der Abhängigkeit vom Telefonie-Subsystem ist die automatische Zeitzonenerkennung auf Android 11 oder niedriger auf Telefoniegeräte beschränkt.

Wenn die Telefonie-Zeitzonenerkennung verfügbar ist, funktioniert sie mit den Signalen Mobile Country Code (MCC) und Network Identity and Time Zone (NITZ) .

Beispielsweise kann ein Gerät in Frankreich die Zeitzone ausschließlich anhand des MCC identifizieren, das von nahe gelegenen Mobilfunkmasten gemeldet wird. Dies ist möglich, weil Frankreich dafür bekannt ist, eine einzige Zeitzone zu verwenden.

Wenn ein Land mehrere Zeitzonen verwendet, reicht das Kundencenter allein nicht aus, um die Zeitzone zu identifizieren. Für diese Länder verwendet das Gerät auch NITZ-Signale, um die richtige Zeitzone zu identifizieren. Dies funktioniert an vielen Orten auf der ganzen Welt gut, erfordert jedoch, dass NITZ-Signale sowohl verfügbar als auch korrekt sind, und ist daher von den Netzbetreibern abhängig.

Die Telefonie-Zeitzonenerkennung ist ein passiver Detektor. Es läuft immer und daher werden oft Telefonievorschläge gemacht, selbst wenn der time_zone_detector Ursprung derzeit nicht Telefonie ist.

Einschränkung der Telefonie-Zeitzonenerkennung

Selbst wenn korrekte NITZ-Signale verfügbar sind, funktioniert die Telefonie-Zeitzonenerkennung nicht immer gut in jedem Land. Das liegt daran, dass NITZ nur Offset- und Sommerzeitinformationen enthält, die nicht immer ausreichen, um eine Zeitzone eindeutig zu identifizieren.

Es gibt viele Orte auf der Welt, an denen dieses Zeitzonenproblem auftreten kann. Beispielsweise können Denver Colorado und Phoenix Arizona in den USA im Winter nicht mit NITZ-Signalen unterschieden werden, wohl aber in anderen Jahreszeiten. An jedem Ort mit ähnlich überlappenden Zeitzonen kann dieses Problem auftreten.

Die folgende Tabelle schlüsselt das Geräteverhalten je nach Jahreszeit beispielhaft für Denver und Phoenix auf:

Ort und Jahreszeit Informationen von MCC oder NITZ Erkannte Zeitzone und Verhalten
Denver, Colorado
Winter
Zeit: 1. Januar 2021 12:00:00
Land: USA
Offset: UTC-7, keine Sommerzeit
Zwei Zonen-IDs stimmen überein:
  • Amerika/Denver
  • Amerika/Phönix

Das Gerät ist korrekt auf Amerika/Denver eingestellt.
Phoenix, Arizona
Winter
Zeit: 1. Januar 2021 12:00:00
Land: USA
Offset: UTC-7, keine Sommerzeit
Zwei Zonen-IDs stimmen überein:
  • Amerika/Denver
  • Amerika/Phönix

Das Gerät ist falsch auf Amerika/Denver eingestellt.
Denver, Colorado
Sommer
Zeit: 1. Juli 2021 12:00:00
Land: USA
Offset: UTC-6, Sommerzeit
Eine Zonen-ID stimmt überein:
  • Amerika/Denver

Das Gerät ist korrekt auf Amerika/Denver eingestellt.
Phoenix, Arizona
Sommer
Zeit: 1. Juli 2021 12:00:00
Land: USA
Offset: UTC-7, keine Sommerzeit
Eine Zonen-ID stimmt überein:
  • Amerika/Phönix

Gerät ist korrekt auf America/Phoenix eingestellt.

Die obigen Beispiele zeigen, dass Android-Geräte in Denver oder Arizona im Winter eine von zwei übereinstimmenden Zeitzonen-IDs auswählen müssen, die für einige Geräte möglicherweise falsch sind, aber dennoch eine scheinbar korrekte Ortszeit anzeigen. Die Geräteuhr, Kalender und andere Apps zeigen die erwartete Ortszeit an, auch wenn die Zeitzonen-ID falsch ist, da beide Zeitzonen-IDs im Winter dieselbe Ortszeit berechnen.

Im Frühjahr, wenn in Denver die Sommerzeit eingehalten wird und in Phoenix nicht, zeigen einige Geräte möglicherweise vorübergehend die falsche Ortszeit an, wenn sie auf die falsche Zeitzonen-ID für den Standort des Benutzers eingestellt sind. Dies wird korrigiert, sobald das Gerät ein neues NITZ-Signal empfängt (insbesondere eines, das „UTC-7, keine Sommerzeit“-Offset-Informationen enthält), aber dies kann einige Zeit dauern und ist von den Netzbetreibern abhängig.

Infolgedessen können Kalender oder andere Apps, die die Zeitzonen-ID vom Winter in den Frühling speichern oder übertragen, möglicherweise die falsche Ortszeit anzeigen und verwenden, bis die entsprechenden Apps die Zeitzonen-ID aktualisieren.

Debuggen und Testen

Im folgenden Abschnitt werden Shell-Befehle zum Debuggen und Testen der Zeitzonenerkennungsfunktion für Telefonie beschrieben.

Einrichtung der Testumgebung

Tester verwenden normalerweise eine Testumgebung mit einer Test- oder simulierten Telefonzelle, um das Zeitzonenerkennungsverhalten der Telefonie zu überprüfen. Die Testzelle kann verwendet werden, um Netzwerke mit verschiedenen MCCs zu simulieren und NITZ-Signale an Geräte zu senden und dann deren Auswirkungen zu überwachen.

Damit das Gerät die Zeitzone erkennen kann, müssen die NITZ-Signalinformationen korrekt sein, mit dem Kundencenter übereinstimmen und mit der Kopie der IANA TZDB (Zeitzonenregeln) des Geräts übereinstimmen. NITZ-Signale, die nicht mit dem MCC übereinstimmen, führen dazu, dass der Ursprung der Telefonie unsicher wird.

Wenn beispielsweise das von der Testzelle verwendete MCC für die USA bestimmt ist, muss das NITZ-Signal eine „Weltzeit“, eine Verschiebung und Informationen zur Sommerzeit enthalten, die für irgendwo in den USA korrekt sind.

Interaktion mit dem com.android.phone-Dienst

Verwenden Sie Folgendes, um zu überprüfen, ob das Gerät die richtigen Zeitzonenvorschläge für die Telefonie empfängt:

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

Dadurch werden Telefonieinformationen ausgegeben, die auch in Android-Fehlerberichten zu finden sind. Auf Geräten mit mehreren SIMs gibt es Informationen für jedes SIM-Radio.

Die Zeitzonenprotokolle zeigen die Vorschläge, die der Telefonieprozess an den time_zone_detector gesendet hat, und die Gründe für das Senden der Vorschläge.

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")]}