전화 통신 시간대 감지

Android 11 이하를 실행하는 기기의 경우 AOSP의 시간대 자동 감지는 전화 통신 하위 시스템의 신호에 의존합니다. 전화 통신 하위 시스템에 의존하므로 Android 11 이하에서는 시간대 자동 감지가 전화 통신 기기로 제한됩니다.

사용할 수 있는 경우 전화 통신 시간대 감지는 모바일 국가 코드(MCC)네트워크 ID 및 시간대(NITZ) 신호를 사용하여 작동합니다.

예를 들어 프랑스에서 기기는 근처 휴대폰 기지국에서 보고한 MCC에만 의존하여 시간대를 식별할 수 있습니다. 프랑스가 단일 시간대를 사용하는 것으로 알려져 있기 때문에 가능합니다.

국가에서 여러 시간대를 사용하는 경우 MCC만으로는 시간대를 식별할 수 없습니다. 이러한 국가의 경우 기기는 NITZ 신호도 사용하여 올바른 시간대를 식별합니다. 이 기능은 전 세계 곳곳에서 잘 작동하지만 두 NITZ 신호를 모두 사용할 수 있고 정확해야 하므로 이동통신사에 의존합니다.

전화 통신 시간대 감지는 수동 감지기입니다. 항상 실행되므로 time_zone_detector 출처가 현재 전화 통신이 아닌 경우에도 전화 통신 추천이 이루어지는 경우가 많습니다.

전화 통신 시간대 감지 제한

올바른 NITZ 신호를 사용할 수 있더라도 전화 통신 시간대 감지가 일부 국가에서는 제대로 작동하지 않습니다. NITZ에는 오프셋과 일광 절약 시간 정보만 포함되며 이 정보가 시간대를 항상 고유하게 식별하지는 않기 때문입니다.

이러한 시간대 문제가 발생할 수 있는 곳이 세계적으로 많습니다. 예를 들어 미국 콜로라도주의 덴버와 애리조나주의 피닉스는 겨울 동안 NITZ 신호를 사용해 구분할 수 없지만 다른 계절에는 구분할 수 있습니다. 비슷하게 겹치는 시간대를 가진 위치에서 이 종류의 문제가 발생할 수 있습니다.

다음 표는 덴버와 피닉스의 계절에 따른 기기 동작을 예시로 보여줍니다.

위치 및 계절 MCC나 NITZ에서 제공하는 정보 감지된 시간대와 동작
콜로라도주 덴버
겨울
시간: 2021년 1월 1월 12:00:00
국가: 미국
오프셋: UTC-7, 일광 절약 시간 없음
두 시간대 ID 일치:
  • America/Denver
  • America/Phoenix

기기가 America/Denver로 올바르게 설정됩니다.
애리조나주 피닉스
겨울
시간: 2021년 1월 1월 12:00:00
국가: 미국
오프셋: UTC-7, 일광 절약 시간 없음
두 시간대 ID 일치:
  • America/Denver
  • America/Phoenix

기기가 America/Denver로 잘못 설정됩니다.
콜로라도주 덴버
여름
시간: 2021년 7월 1일 12:00:00
국가: 미국
오프셋: UTC-6, 일광 절약 시간
시간대 ID 한 개 일치:
  • America/Denver

기기가 America/Denver로 올바르게 설정됩니다.
애리조나주 피닉스
여름
시간: 2021년 7월 1월 12:00:00
국가: 미국
오프셋: UTC-7, 일광 절약 시간 없음
시간대 ID 한 개 일치:
  • America/Phoenix

기기가 America/Phoenix로 올바르게 설정됩니다.

위의 예를 보면 겨울 동안 덴버 또는 애리조나주에 있는 Android 기기는 일치하는 시간대 ID 두 개 중 하나를 선택해야 하며, 이는 일부 기기에서는 잘못되었을 수도 있지만 현지 시간은 올바르게 표시됩니다. 시간대 ID가 잘못된 경우에도 겨울 동안 두 시간대 ID 모두가 동일한 현지 시간을 계산하므로 기기의 시계, 캘린더, 기타 앱에 현지 시간이 제대로 표시됩니다.

하지만 덴버에서 일광 절약 시간을 준수하고 피닉스에서는 그러지 않는 봄에는 일부 기기에서 사용자 위치의 시간대 ID가 잘못 설정된 경우 일시적으로 잘못된 현지 시간이 표시될 수도 있습니다. 이 동작은 기기가 새로운 NITZ 신호(특히 'UTC-7, 일광 절약 시간 없음' 오프셋 정보가 포함된 신호)를 수신하자마자 수정되지만 그러려면 시간이 걸릴 수 있으며 이동통신사에 따라 다릅니다.

결과적으로, 캘린더 또는 시간대 ID를 저장하거나 겨울에서 봄으로 이전하는 다른 앱에서는 관련 앱이 시간대 ID를 업데이트할 때까지 잘못된 현지 시간을 표시하고 사용할 수도 있습니다.

디버깅 및 테스트

다음 섹션에서는 전화 통신 시간대 감지 기능을 디버깅하고 테스트하기 위한 셸 명령어를 설명합니다.

테스트 환경 설정

테스터는 일반적으로 테스트 또는 시뮬레이션된 전화 통신 셀이 있는 테스트 환경을 사용하여 전화 통신 시간대 감지 동작을 확인합니다. 테스트 셀을 사용하여 다양한 MCC를 사용하여 네트워크를 시뮬레이션하고 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")]}