Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

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, 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 Mã quốc gia di động (MCC) và tín hiệu 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 là có thể bởi 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ũng 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 có sẵn và chính xác và do đó nó phụ thuộc vào các nhà cung cấp dịch vụ.

Phát hiện múi giờ đ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 về điện thoại thường được đưa ra ngay cả khi nguồn gốc 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ó sẵn cá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 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ù đắp và tiết kiệm ánh sáng ban ngày, không phải lúc nào cũng đủ để xác định một múi giờ duy nhất.

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ụ: không thể phân biệt Denver Colorado và Phoenix Arizona ở Hoa Kỳ bằng cách sử dụng tín hiệu NITZ trong mùa đông, nhưng có thể trong các mùa khác. Bất kỳ vị trí nào có múi giờ trùng lặp giống nhau đều có thể gặp phải loại sự cố này.

Bảng sau chia nhỏ hành vi của thiết bị tùy thuộc vào mùa của 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: ngày 1 tháng 1 năm 2021 12:00:00
Quốc gia: US
Bù đắp: UTC-7, không tiết kiệm ánh sáng ban ngày
Hai ID vùng khớp với nhau:
  • Châu Mỹ / Denver
  • America / Phoenix

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

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: US
Bù đắp: UTC-6, tiết kiệm ánh sáng ban ngày
ID một vùng phù hợp với:
  • Châu Mỹ / Denver

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

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ồ thiết bị, lịch và các ứng dụng khác 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 toán cùng một giờ địa phương trong mùa đông.

Tuy nhiên, vào mùa xuân khi Denver quan sát thời gian 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 múi giờ ID cho vị trí của người dùng. Điều này được khắc phục ngay sau 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ù trừ "UTC-7, không tiết kiệm ánh sáng ban ngày"), nhưng điều này có thể mất một chút thời gian và phụ 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 mang theo 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 có 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à thử nghiệm 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 thử nghiệm thường sử dụng môi trường thử nghiệm với một tế bào đ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. Tế bào thử nghiệm có thể được sử dụng để mô phỏng các mạng với 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 ảnh hưở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ị. Các tín hiệu NITZ không nhất quán với MCC khiến nguồn gốc điện thoại trở nên không chắc chắn.

Ví dụ: nếu MCC được ô kiểm tra sử dụng là dành cho Hoa Kỳ, thì tín hiệu NITZ phải chứa thông tin "giờ quốc 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ác đề xuất đúng múi giờ của điện thoại, hãy sử dụng:

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

Điều này kết xuấ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 mỗi đài SIM.

Nhật ký múi giờ hiển thị các đề xuất mà quá 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")]}