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

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

Khi có thể phát hiện múi giờ của điện thoại, tính năng này sẽ hoạt động bằng cách sử dụng Mã quốc gia trên thiết bị di động (MCC)Danh tính mạng và múi giờ (NITZ) tín hiệu.

Ví dụ: một thiết bị ở Pháp có thể xác định múi giờ chỉ dựa vào MCC được các trạm phát sóng lân cận báo cáo. Điều này có thể xảy ra vì Pháp nổi tiếng với hãy 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 không đủ để xác định múi giờ. Đối với những quốc gia này, thiết bị cũng sử dụng tín hiệu NITZ để xác định múi giờ chính xác. Tính năng này hoạt động hiệu quả ở nhiều nơi trên thế giới nhưng cần có tín hiệu NITZ cả có sẵn và chính xác do đó phụ thuộc vào nhà mạng.

Tính năng phát hiện múi giờ của điện thoại là trình phát hiện thụ động. Chiến dịch này luôn chạy và vì vậy, các đề xuất qua điện thoại thường được đưa ra ngay cả khi Thuật toán time_zone_detector hiện không phải là điện thoại.

Giới hạn phát hiện múi giờ của điện thoại

Ngay cả khi có tín hiệu NITZ chính xác, tính năng phát hiện múi giờ của điện thoại sẽ không luôn hoạt động tốt ở mọi quốc gia. Điều này là do NITZ chỉ bao gồm giá trị bù trừ và thông tin giờ mùa hè, không phải lúc nào cũng đủ để xác định duy nhất múi giờ.

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

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

Vị trí và mùa Thông tin từ MCC hoặc NITZ Múi giờ và hành vi được phát hiện
Denver, Colorado
Mùa đông
Thời gian: 12:00:00 ngày 1 tháng 1 năm 2021
Quốc gia: Hoa Kỳ
Bù: UTC-7, không có giờ mùa hè
Mã vùng trùng khớp:
  • Mỹ/Denver
  • Mỹ/Phượng hoàng

Thiết bị được đặt chính xác thành America/Denver.
Phoenix, Arizona
Mùa đông
Thời gian: 12:00:00 ngày 1 tháng 1 năm 2021
Quốc gia: Hoa Kỳ
Bù: UTC-7, không có giờ mùa hè
Mã vùng trùng khớp:
  • 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: 12:00:00 ngày 1 tháng 7 năm 2021
Quốc gia: Hoa Kỳ
Bù: UTC-6, tiết kiệm ánh sáng ngày
Một mã vùng khớp với:
  • Mỹ/Denver

Thiết bị được đặt chính xác thành America/Denver.
Phoenix, Arizona
Mùa hè
Thời gian: 12:00:00 ngày 1 tháng 7 năm 2021
Quốc gia: Hoa Kỳ
Bù: UTC-7, không có giờ mùa hè
Một mã vùng khớp với:
  • 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 vào mùa đông, các thiết bị Android ở Denver hoặc Arizona phải chọn một trong hai mã múi giờ trùng khớp. Điều 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 rõ ràng chính xác. Thiết bị đồng hồ, lịch và các ứng dụng khác hiển thị giờ địa phương dự kiến ngay cả khi mã múi giờ không chính xác vì cả hai mã múi giờ đều tính cùng một mã múi giờ vào mùa đông.

Tuy nhiên, vào mùa xuân khi Denver quan sát giờ mùa hè và Phoenix thì có không, một số thiết bị có thể tạm thời hiện giờ địa phương không chính xác nếu bạn đã đặt thành mã múi giờ không chính xác cho vị trí của người dùng. Lỗi này sẽ sớm được khắc phục khi thiết bị nhận được tín hiệu NITZ mới (cụ thể là tín hiệu có chứa "UTC-7, không có giờ mùa hè" thông tin bù trừ), nhưng quá trình này có thể mất chút thời gian và phụ thuộc vào các nhà mạng.

Do đó, lịch hoặc các ứng dụng khác lưu trữ hoặc có chứa mã múi giờ từ mùa đông đến mùa xuân có thể hiển thị và sử dụng giờ địa phương không chính xác cho đến các ứng dụng liên quan sẽ cập nhật mã 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 thử tính năng phát hiện múi giờ điện thoại.

Thiết lập môi trường kiểm thử

Người thử nghiệm thường sử dụng một môi trường thử nghiệm có một điện thoại di động 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 dùng để mô phỏng mạng bằng các MCC khác nhau và gửi tín hiệu NITZ đến các thiết bị và sau đó theo dõi tác động của chúng.

Để thiết bị phát hiện được 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 của thiết bị (quy tắc múi giờ). Tín hiệu NITZ không nhất quán với MCC sẽ khiến thuật toán điện thoại trở nên không chắc chắn.

Ví dụ: nếu MCC mà ô 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 về "giờ chung", độ lệch và giờ mùa hè là chính xác cho khu vực 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ờ chính xác cho điện thoại, sử dụng:

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

Thao tác này sẽ kết xuất thông tin điện thoại, thông tin này cũng có thể có trong lỗi Android . Trên các thiết bị có nhiều SIM, thông tin của từng đài SIM sẽ được cung cấp.

Nhật ký múi giờ cho thấy các đề xuất mà quy trình điện thoại đã gửi đến 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")]}