Phát hiện múi giờ điện thoại

Đối với các thiết bị chạy Android 11 trở xuống, tính năng phát hiện múi giờ tự động trong AOSP dựa vào tín hiệu từ hệ thống con điện thoại. Do phụ thuộc vào hệ thống con điện thoại nên tính năng phát hiện múi giờ tự động trên Android 11 trở xuống bị giới hạn ở các thiết bị điện thoại.

Khi tính năng phát hiện múi giờ của điện thoại khả dụng, nó sẽ hoạt động bằng cách sử dụng tín hiệu Mã quốc gia di động (MCC)Nhận dạng mạng và múi giờ (NITZ) .

Ví dụ: một thiết bị ở Pháp có thể xác định múi giờ chỉ dựa trên MCC do các tháp di động gần đó báo cáo. Điều này có thể thực hiện được vì Pháp được biết là sử dụng một múi giờ duy nhất.

Khi một quốc gia sử dụng nhiều múi giờ, chỉ MCC là không đủ để xác định múi giờ. Đối với những quốc gia này, thiết bị còn sử dụng tín hiệu NITZ để xác định múi giờ chính xác. Điều này hoạt động tốt ở nhiều nơi trên thế giới nhưng nó đòi hỏi tín hiệu NITZ phải sẵn có và chính xác và do đó nó phụ thuộc vào các nhà mạng.

Phát hiện múi giờ của điện thoại là một máy dò thụ động . Nó chạy mọi lúc và do đó, các đề xuất qua điện thoại thường được đưa ra ngay cả khi thuật toán time_zone_detector đang hoạt động hiện không phải là điện thoại.

Hạn chế phát hiện múi giờ của điện thoại

Ngay cả khi có sẵn tín hiệu NITZ chính xác, việc phát hiện múi giờ qua điện thoại không phải lúc nào cũng hoạt động tốt ở mọi quốc gia. Điều này là do NITZ chỉ chứa thông tin bù trừ và tiết kiệm ánh sáng ban ngày, không phải lúc nào cũng đủ để xác định duy nhất một múi giờ.

Có nhiều nơi trên thế giới có thể xảy ra vấn đề về múi giờ này. Ví dụ: Denver Colorado và Phoenix Arizona ở Hoa Kỳ không thể phân biệt được bằng tín hiệu NITZ trong mùa đông nhưng có thể phân biệt được trong các mùa khác. Bất kỳ vị trí nào có múi giờ trùng lặp tương tự đều có thể gặp phải loại sự cố này.

Bảng sau đây phân tích hành vi của thiết bị tùy theo mùa ở Denver và Phoenix làm ví dụ:

Vị trí và mùa Thông tin từ MCC hoặc NITZ Đã phát hiện múi giờ và hành vi
Denver, Colorado
Mùa đông
Thời gian: Ngày 1 tháng 1 năm 2021 12:00:00
Quốc gia: Mỹ
Bù đắp: UTC-7, không tiết kiệm ánh sáng ban ngày
Hai ID vùng khớp nhau:
  • Mỹ/Denver
  • Mỹ/Phượng Hoàng

Thiết bị được đặt chính xác thành America/Denver.
Phượng hoàng, Arizona
Mùa đông
Thời gian: Ngày 1 tháng 1 năm 2021 12:00:00
Quốc gia: Mỹ
Bù đắp: UTC-7, không tiết kiệm ánh sáng ban ngày
Hai ID vùng khớp nhau:
  • Mỹ/Denver
  • Mỹ/Phượng Hoàng

Thiết bị được đặt không chính xác thành America/Denver.
Denver, Colorado
Mùa hè
Thời gian: Ngày 1 tháng 7 năm 2021 12:00:00
Quốc gia: Mỹ
Bù đắp: UTC-6, tiết kiệm ánh sáng ban ngày
ID một vùng khớp:
  • Mỹ/Denver

Thiết bị được đặt chính xác thành America/Denver.
Phượng hoàng, Arizona
Mùa hè
Thời gian: Ngày 1 tháng 7 năm 2021 12:00:00
Quốc gia: Mỹ
Bù đắp: UTC-7, không tiết kiệm ánh sáng ban ngày
ID một vùng khớp:
  • Mỹ/Phượng Hoàng

Thiết bị được đặt chính xác thành America/Phoenix.

Các ví dụ trên cho thấy rằng trong mùa đông, các thiết bị Android ở Denver hoặc Arizona phải chọn một trong hai ID múi giờ phù hợp. ID này có thể không chính xác đối với một số thiết bị nhưng vẫn hiển thị giờ địa phương có vẻ chính xác. Đồng hồ, lịch và các ứng dụng khác của thiết bị hiển thị giờ địa phương dự kiến ​​ngay cả khi ID múi giờ không chính xác vì cả hai ID múi giờ đều tính giờ địa phương giống nhau trong mùa đông.

Tuy nhiên, vào mùa xuân khi Denver áp dụng giờ tiết kiệm ánh sáng ban ngày còn Phoenix thì không, một số thiết bị có thể tạm thời hiển thị giờ địa phương không chính xác nếu chúng được đặt sai ID múi giờ cho vị trí của người dùng. Điều này được khắc phục ngay khi thiết bị nhận được tín hiệu NITZ mới (cụ thể là tín hiệu có chứa thông tin bù "UTC-7, không tiết kiệm ánh sáng ban ngày"), nhưng việc này có thể mất một chút thời gian và tùy thuộc vào nhà cung cấp dịch vụ.

Do đó, lịch hoặc các ứng dụng khác lưu trữ hoặc chuyển ID múi giờ từ mùa đông sang mùa xuân có thể hiển thị và sử dụng sai giờ địa phương cho đến khi các ứng dụng liên quan cập nhật ID múi giờ.

Gỡ lỗi và thử nghiệm

Phần sau đây mô tả các lệnh shell để gỡ lỗi và kiểm tra tính năng phát hiện múi giờ của điện thoại.

Thiết lập môi trường thử nghiệm

Người kiểm tra thường sử dụng môi trường kiểm tra với ô điện thoại thử nghiệm hoặc mô phỏng để kiểm tra hành vi phát hiện múi giờ của điện thoại. Ô thử nghiệm có thể được sử dụng để mô phỏng các mạng có MCC khác nhau và gửi tín hiệu NITZ đến các thiết bị, sau đó theo dõi tác động của chúng.

Để thiết bị phát hiện múi giờ, thông tin tín hiệu NITZ phải chính xác, nhất quán với MCC và khớp với bản sao IANA TZDB (quy tắc múi giờ) của thiết bị. Tín hiệu NITZ không nhất quán với MCC khiến thuật toán điện thoại trở nên không chắc chắn.

Ví dụ: nếu MCC được ô thử nghiệm sử dụng là dành cho Hoa Kỳ thì tín hiệu NITZ phải chứa thông tin "giờ phổ quát", độ lệch và tiết kiệm ánh sáng ban ngày chính xác cho một nơi nào đó ở Hoa Kỳ.

Tương tác với dịch vụ com.android.phone

Để xác minh rằng thiết bị đang nhận được đề xuất múi giờ điện thoại chính xác, hãy sử dụng:

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

Điều này làm mất thông tin điện thoại, thông tin này cũng có thể được tìm thấy trong các báo cáo lỗi của Android. Trên các thiết bị có nhiều SIM, có thông tin cho từng đài SIM.

Nhật ký múi giờ hiển thị các đề xuất mà quy trình điện thoại đã gửi tới time_zone_Detector và lý do gửi đề xuất.

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