Tổng quan về thời gian

Trang này mô tả cách hoạt động của tính năng phát hiện thời gian và múi giờ trên Android. Điều này bao gồm cách Android tự động phát hiện thời gian và múi giờ, các lựa chọn cấu hình cho nhà sản xuất thiết bị và thông tin kiểm thử.

Tổng quan về thời gian và múi giờ

Để xác định giờ địa phương của người dùng để hiển thị ở những vị trí như thanh trạng thái, Android theo dõi 2 trạng thái có liên quan nhưng độc lập:

  • Thời gian bắt đầu của hệ thống Unix hiện tại
  • Múi giờ hiện tại

Thời gian hiện tại của kỷ nguyên Unix và múi giờ hiện tại là các trạng thái trên toàn thiết bị, tức là tất cả người dùng của một thiết bị đều dùng chung các trạng thái này.

Thời gian hiện tại theo hệ thống Unix không phải là một giá trị cố định. Đồng hồ này tự động cập nhật để phản ánh thời gian đã trôi qua. Ngoài thời gian trôi qua bình thường, thời gian theo kỷ nguyên Unix hiện tại của một thiết bị sẽ được điều chỉnh nếu phát hiện thấy thời gian đó không chính xác, ví dụ: sau khi thiết bị mất nguồn.

Múi giờ hiện tại xác định mức điều chỉnh cần thực hiện để chuyển đổi thời gian bắt đầu của hệ thống Unix hiện tại thành giờ địa phương. Ví dụ: vào mùa hè ở Los Angeles, thiết bị sẽ trừ 7 giờ so với thời gian hiện tại theo kỷ nguyên Unix, còn vào mùa đông thì thiết bị sẽ trừ 8 giờ.

Để hỗ trợ các phép tính giờ địa phương này, tất cả thiết bị Android đều có một cơ sở dữ liệu gồm tất cả các quy tắc về múi giờ trên toàn cầu. Để biết thêm thông tin về các quy tắc múi giờ, hãy xem phần Quy tắc múi giờ.

Khi người dùng di chuyển đến một vị trí mới sử dụng múi giờ khác, bạn không cần điều chỉnh thời gian hiện tại theo kỷ nguyên Unix nhưng người dùng thường muốn xem giờ địa phương thay vì giờ ở vị trí trước đó của họ. Việc thay đổi múi giờ hiện tại đảm bảo rằng độ lệch chính xác được áp dụng cho thời gian bắt đầu của hệ thống Unix hiện tại để hiển thị thời gian địa phương chính xác cho vị trí mới.

AOSP cho phép người dùng tự kiểm soát việc thời gian và múi giờ có được tự động đặt cho họ hay không thông qua các cơ chế sau.

  • Tự động phát hiện thời gian: Đảm bảo thiết bị có thời gian Unix epoch hiện tại chính xác.
  • Tự động phát hiện múi giờ: Đảm bảo thiết bị có múi giờ hiện tại chính xác.

Tự động phát hiện thời gian

Phần này cung cấp thông tin tổng quan về dịch vụ time_detector giúp quản lý tính năng tự động phát hiện thời gian, các chế độ kiểm soát của người dùng, lựa chọn cấu hình và thông tin chi tiết về hoạt động kiểm thử.

Dịch vụ time_detector

Dịch vụ time_detector có trên các thiết bị chạy Android 10 trở lên, giúp quản lý tính năng tự động phát hiện thời gian. Nó điều chỉnh thời gian Unix epoch hiện tại của thiết bị khi cần thiết khi bạn bật tính năng tự động phát hiện thời gian.

Dịch vụ time_detector luôn ở một trong hai trạng thái: certain hoặc uncertain. Trạng thái chắc chắn hoặc không chắc chắn của dịch vụ được xác định bằng đề xuất về thời gian mà dịch vụ nhận được từ nhiều nguồn.

Khi dịch vụ time_detector chắc chắn, tức là dịch vụ đã nhận được một đề xuất có thông tin về thời gian bắt đầu của hệ thống Unix, dịch vụ sẽ ghi đè thời gian bắt đầu của hệ thống Unix hiện tại nếu đề xuất thời gian khác với thời gian bắt đầu của hệ thống Unix hiện tại.

Khi time_detector không chắc chắn, nó sẽ không ghi đè thời gian hiện tại. Trạng thái không chắc chắn thường có nghĩa là dịch vụ time_detector chưa nhận được đề xuất về thời gian. Dịch vụ time_detector cũng trở nên không chắc chắn nếu các đề xuất mà dịch vụ này nhận được được coi là quá cũ để sử dụng. Tuổi của các đề xuất được xem xét vì các điều chỉnh sử dụng đề xuất thời gian cũ của kỷ nguyên Unix dựa vào đồng hồ thời gian thực đã trôi qua trên thiết bị, được giả định là không chính xác trong thời gian dài.

Để tự động thiết lập thời gian theo kỷ nguyên Unix hiện tại, thiết bị có thể sử dụng nhiều nguồn. Trong tài liệu này, những miền này được gọi là nguồn gốc. Dịch vụ time_detector coi các chuỗi đề xuất là riêng biệt dựa trên nguồn gốc của chúng.

Dịch vụ time_detector có trạng thái, tức là dịch vụ này lưu giữ bản ghi về đề xuất gần đây nhất của mỗi nguồn. Đề xuất mới sẽ được đưa ra cho time_detector nếu một nguồn có thông tin mới hơn về thời gian bắt đầu tính từ kỷ nguyên Unix. Dịch vụ time_detector đánh giá lại các đề xuất mới và hiện có, đồng thời cập nhật trạng thái thiết bị khi nhận được đề xuất.

Mặc dù thời gian UTC được quốc tế công nhận, nhưng có nhiều lý do khiến việc xác định thời gian Unix epoch hiện tại không phải lúc nào cũng đơn giản đối với một thiết bị chạy Android:

  • Thời gian bắt đầu của hệ thống Unix là một hệ thống tính giờ khác biệt tinh tế so với thời gian UTC. Để chuyển đổi giữa hai loại này, bạn cần biết thời điểm xảy ra giây nhuận và cách các nguồn gốc xử lý giây nhuận.
  • Nguồn gốc có thể chỉ xuất hiện vào một số thời điểm hoặc trong một số trường hợp nhất định. Ví dụ: nếu nguồn yêu cầu kết nối mạng, thì nguồn đó có thể chỉ dùng được khi thiết bị kết nối với Internet.
  • Nguồn gốc có thể không chính xác hoặc không rõ ràng, hoặc có lỗi. Ví dụ: nếu một trạm phát sóng điện thoại không theo dõi đúng giờ UTC, thì nguồn gốc điện thoại có thể đưa ra các đề xuất không chính xác về thời gian.
  • Có thể xảy ra lỗi không chính xác trong quá trình lấy thời gian theo thời gian Unix. Ví dụ: độ trễ mạng, việc lưu vào bộ nhớ đệm hoặc lập lịch xử lý có thể khiến thời gian Unix không chính xác.
  • Đồng hồ tham chiếu dùng để điều chỉnh đề xuất về thời gian đã trôi qua kể từ khi nhận được đề xuất có thể không chính xác.

Theo mặc định, AOSP được định cấu hình để sử dụng 2 nguồn phát hiện thời gian chính:

  • Mạng: Sử dụng máy chủ thời gian Giao thức Thời gian Mạng (NTP).
  • Điện thoại: Sử dụng tín hiệu điện thoại Nhận dạng mạng và múi giờ (NITZ).

Cả nguồn gốc điện thoại và mạng đều yêu cầu kết nối với các mạng bên ngoài, không phải lúc nào cũng có sẵn.

Kể từ Android 12, Android cũng hỗ trợ các nguồn sau đây (theo mặc định, các nguồn này không được định cấu hình để sử dụng):

  • GNSS: Sử dụng trình cung cấp vị trí GPS để lấy thời gian từ nguồn GNSS.
  • Bên ngoài: Nguồn gốc chung cho phép nhà sản xuất thiết bị tích hợp nguồn thời gian Unix của riêng họ.

Cài đặt thời gian

Người dùng có thể bật tính năng tự động phát hiện thời gian trong phần Hệ thống > Ngày và giờ của ứng dụng Cài đặt AOSP.

Tự động phát hiện thời gian trong phần Cài đặt

Hình 1. Tự động phát hiện thời gian trong phần Cài đặt.

Bảng sau đây mô tả các chế độ kiểm soát của người dùng để phát hiện thời gian trong ứng dụng Cài đặt AOSP.

*Trên Android 11 trở xuống, chế độ cài đặt này có tên là Sử dụng thời gian do mạng cung cấp

Vị trí của phần Cài đặt AOSP Tên của phần Cài đặt AOSP Phạm vi Hành vi
Hệ thống > Ngày và giờ Tự động đặt giờ* Tất cả người dùng

Một nút bật/tắt.

Khi ở trạng thái bật, thiết bị chịu trách nhiệm phát hiện thời gian hiện tại theo kỷ nguyên Unix. Khi ở trạng thái tắt, người dùng sẽ có các chế độ kiểm soát để đặt thời gian của thiết bị theo cách thủ công.

Khi nhập thời gian theo cách thủ công, người dùng sẽ nhập giờ địa phương, chứ không phải thời gian theo kỷ nguyên Unix. Thời gian hiện tại của Unix được tính bằng cách sử dụng múi giờ hiện tại để lấy thời gian của Unix.

Cấu hình

Nhà sản xuất thiết bị có thể định cấu hình dịch vụ time_detector theo nhiều cách, chẳng hạn như chọn nguồn gốc để sử dụng và cách ưu tiên các tín hiệu từ nguồn gốc đó.

Mức độ ưu tiên của nguồn

Từ Android 12, nhà sản xuất thiết bị có thể thay đổi tệp cấu hình core/res/res/values/config.xml để chỉ định những nguồn gốc thời gian cần đưa vào tính năng tự động phát hiện thời gian và mức độ ưu tiên mà time_detector xem xét những nguồn gốc này.

Đối với các thiết bị chạy Android 11 trở xuống, mức độ ưu tiên của nguồn gốc được mã hoá cứng thành ["telephony", "network"], tức là các đề xuất liên quan đến điện thoại sẽ được ưu tiên hơn các đề xuất liên quan đến mạng.

Cấu hình AOSP mặc định như sau:

<!-- Specifies priority of automatic time sources. Suggestions from higher entries in the list
     take precedence over lower ones.
     See com.android.server.timedetector.TimeDetectorStrategy for available sources. -->
<string-array name="config_autoTimeSourcesPriority">
    <item>network</item>
    <item>telephony</item>
</string-array>

Trong Android 12, các đề xuất về mạng và điện thoại được định cấu hình làm nguồn để sử dụng theo mặc định. Các đề xuất về thời gian mạng được ưu tiên hơn các đề xuất về thời gian điện thoại. Các nhà sản xuất thiết bị có thể thay đổi thứ tự của các nguồn gốc để quay lại hành vi trong Android 11 trở xuống, trong đó điện thoại được ưu tiên cao hơn.

Theo mặc định, nếu đề xuất hợp lệ có mức độ ưu tiên cao nhất khớp với thời gian hiện tại của đồng hồ hệ thống trên thiết bị trong vòng vài giây, thì thời gian trên thiết bị sẽ không thay đổi. Điều này nhằm tránh tạo công việc cho các ứng dụng đã cài đặt và lắng nghe ý định ACTION_TIME_CHANGED.

Các giá trị nguồn được phép là:

Giới hạn thời gian được phép

Android 14 giới thiệu giới hạn thời gian trên cho các đề xuất về thời gian mà dịch vụ time_detector nhận được. Nếu thiết bị hỗ trợ các quy trình 32 bit, thì khung sẽ đặt giới hạn thời gian trên để ngăn thiết bị sử dụng đề xuất thời gian có thể kích hoạt vấn đề Y2038.

Android 12 đã giới thiệu một giới hạn thời gian thấp hơn được dùng để xác thực các đề xuất về thời gian mà dịch vụ time_detector nhận được. Giá trị giới hạn thời gian dưới được dùng cho các đề xuất tự động được đặt từ dấu thời gian của bản dựng. Điều này hoạt động dựa trên nguyên tắc rằng thời gian hợp lệ không thể trước khi hình ảnh hệ thống của thiết bị được tạo. Nếu đề xuất về thời gian là trước giới hạn thời gian dưới, thì dịch vụ time_detector sẽ loại bỏ đề xuất vì đề xuất không thể hợp lệ nếu dấu thời gian bản dựng là chính xác.

Đối với các thiết bị chạy Android 11 trở xuống, dịch vụ time_detector không xác thực các đề xuất về thời gian theo kỷ nguyên Unix đến.

Gỡ lỗi và kiểm thử thời gian

Phần này cung cấp thông tin về cách gỡ lỗi và kiểm thử hành vi của dịch vụ time_detector và các thành phần khác được chia sẻ bởi tất cả các nguồn.

Tương tác với dịch vụ time_detector

Để xem cấu hình và trạng thái của dịch vụ time_detector, hãy dùng:time_detector

adb shell cmd time_detector dump

Để xem các lệnh bổ sung để gỡ lỗi và kiểm thử tính năng phát hiện múi giờ, hãy sử dụng:

adb shell cmd time_detector help

Đầu ra trợ giúp cũng mô tả các thuộc tính dịch vụ device_config có thể dùng để ảnh hưởng đến hành vi của time_detector cho mục đích kiểm thử hoặc trong quá trình sản xuất. Để biết thông tin chi tiết, hãy xem bài viết Định cấu hình thiết bị bằng dịch vụ device_config.

Để xác thực tính năng tự động phát hiện thời gian, người kiểm thử phải biết dịch vụ time_detector đang sử dụng nguồn gốc nào. Sau đây là ví dụ về đầu ra của lệnh adb shell cmd time_detector dump, với thông tin về trạng thái dịch vụ và nguồn gốc hiện tại được in đậm:

$ adb shell cmd time_detector dump

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=null
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=23717241
  mEnvironment.systemClockMillis()=1626707861336
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-07-19T07:48:05Z(1626680885000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    ...
  Telephony suggestion history:
    ...
  Network suggestion history:
    ...
  Gnss suggestion history:
    ...
  External suggestion history:
    ...

Bạn có thể diễn giải thông tin này như sau:

Khóa Giá trị
mEnvironment.isAutoTimeDetectionEnabled() Có bật tính năng tự động phát hiện thời gian hay không.
mEnvironment.autoTimeLowerBound() Giới hạn dưới hiện tại được dùng để xác thực các đề xuất về thời gian.
mEnvironment.autoOriginPriorities() Các nguồn gốc đang được sử dụng và thứ tự ưu tiên.

Nhật ký thay đổi thời gian cho biết những trường hợp dịch vụ time_detector đã thay đổi thời gian bắt đầu của hệ thống Unix hiện tại trên thiết bị.

Thông tin về nhật ký đề xuất cho biết những đề xuất mà mỗi nguồn đã đưa ra.

Tự động phát hiện múi giờ

Phần này cung cấp thông tin tổng quan về dịch vụ time_zone_detector quản lý tính năng tự động phát hiện múi giờ, các chế độ kiểm soát của người dùng trong phần cài đặt, tính năng phát hiện múi giờ qua điện thoại và vị trí, cũng như thông tin chi tiết về việc kiểm thử.

Dịch vụ time_zone_detector

Dịch vụ time_zone_detector có trên các thiết bị chạy Android 11 trở lên, quản lý tính năng tự động phát hiện múi giờ. Tính năng này sẽ điều chỉnh múi giờ hiện tại của thiết bị khi cần thiết nếu bạn bật tính năng tự động phát hiện múi giờ.

Khi bật tính năng tự động phát hiện múi giờ, time_zone_detector có thể ở một trong hai trạng thái: certainuncertain.

Khi dịch vụ time_zone_detector ở một trạng thái nhất định, điều này có nghĩa là dịch vụ time_zone_detector đã nhận được thông tin múi giờ chính xác, có thể khiến dịch vụ này ghi đè múi giờ hiện tại. Khi không chắc chắn, điều này có nghĩa là hệ thống không nhận được thông tin nào hoặc chỉ nhận được thông tin có độ tin cậy thấp, tức là hệ thống sẽ không ghi đè múi giờ hiện tại.

Một số trạng thái của dịch vụ time_zone_detector có thể bao gồm những trạng thái mà time_zone_detector không có thông tin múi giờ để sử dụng hoặc có nhiều múi giờ để lựa chọn. Các trạng thái này như sau:

  • Một trạng thái nhất định có múi giờ bằng 0 sẽ được nhập khi thiết bị ở một nơi không có múi giờ, chẳng hạn như ở vùng biển quốc tế hoặc ở khu vực tranh chấp. Trạng thái này tương tự như trạng thái không chắc chắn, nhưng cho biết rằng time_zone_detector không cần thực hiện thêm hành động nào để cố gắng xác định múi giờ.
  • Một trạng thái nhất định có nhiều múi giờ được nhập vào nơi có sự mơ hồ hoặc điều kiện biên. Ở trạng thái này, nếu múi giờ hiện tại là một trong các múi giờ mà time_zone_detector chắc chắn, thì múi giờ hiện tại sẽ được giữ nguyên. Nếu không, một trong các múi giờ có sẵn sẽ được sử dụng. Điều này mang lại cho time_zone_detector một yếu tố về độ ổn định nếu người dùng đã chọn múi giờ theo cách thủ công trước đó hoặc khi thiết bị tiến đến một đường biên giới.

Trạng thái chắc chắn hoặc không chắc chắn của dịch vụ time_zone_detector được xác định bằng đề xuất về múi giờ do một thuật toán gửi.

Nhìn chung, các đề xuất có hai loại gần giống với các trạng thái có thể có của time_zone_detector: certainuncertain. Sau đây là ví dụ về các loại đề xuất:

  • type = uncertain, zoneIds = []

    • Thuật toán không biết múi giờ.
  • type = certain, zoneIds = ["Europe/London"]

    • Thuật toán chắc chắn rằng múi giờ là Châu Âu/London.
  • type = certain, zoneIds = []`

    • Thuật toán này chắc chắn, nhưng không có mã nhận dạng khu vực nào liên kết với vị trí hiện tại.
  • type = certain, zoneIds = ["America/Denver", "America/Phoenix"]

    • Thuật toán chắc chắn rằng câu trả lời là một trong hai múi giờ, nhưng không thể chọn giữa America/Denver và America/Phoenix.

Dịch vụ time_zone_detector coi các chuỗi đề xuất là riêng biệt dựa trên thuật toán của mình. Tuỳ thuộc vào thuật toán, các đề xuất cũng có thể chứa siêu dữ liệu cho biết độ chắc chắn của thuật toán.

Dịch vụ time_zone_detector có trạng thái, tức là dịch vụ này lưu giữ bản ghi về đề xuất gần đây nhất do mỗi thuật toán đưa ra. Các đề xuất mới sẽ được gửi đến dịch vụ time_zone_detector nếu một đề xuất trước đó không còn chính xác; tức là nếu một thuật toán hiện có một đề xuất khác hoặc nếu thuật toán đó không còn khả năng phát hiện múi giờ. Dịch vụ time_zone_detector sẽ đánh giá lại các đề xuất mới và hiện có, đồng thời cập nhật trạng thái thiết bị khi nhận được đề xuất.

Android hỗ trợ 2 thuật toán để phát hiện múi giờ:

  • Điện thoại
  • Vị trí

Dịch vụ time_zone_detector thường sử dụng một thuật toán duy nhất để xác định múi giờ. Khi thuật toán vị trí được hỗ trợ trên một thiết bị, thuật toán mà thiết bị sử dụng sẽ được xác định dựa trên chế độ cài đặt Múi giờ do người dùng định cấu hình. Khi thuật toán đang dùng không xác định được múi giờ, time_zone_detector thường không dùng các đề xuất từ một thuật toán khác. time_zone_detector có thể giữ các đề xuất liên kết với những thuật toán không được dùng trong bộ nhớ, nhưng các đề xuất này sẽ không được dùng trừ phi thuật toán thay đổi. Khi người dùng thay đổi chế độ cài đặt cho tính năng tự động phát hiện múi giờ và thuật toán thay đổi, hệ thống sẽ sử dụng đề xuất gần đây nhất có sẵn cho thuật toán mới.

Để biết thông tin chi tiết về trường hợp sử dụng nhiều thuật toán để xác định múi giờ, hãy xem phần Chế độ dự phòng của dịch vụ điện thoại.

Chế độ dự phòng điện thoại

Trên các thiết bị chạy Android 13 trở lên, dịch vụ time_zone_detector hỗ trợ chế độ dự phòng cho điện thoại. Chế độ này cho phép Android tạm thời sử dụng các đề xuất phát hiện qua điện thoại trong trường hợp tính năng phát hiện vị trí không phát hiện được múi giờ hoặc trong trường hợp tính năng phát hiện vị trí mất nhiều thời gian hơn để phát hiện múi giờ so với tính năng phát hiện qua điện thoại.

Chế độ dự phòng cho điện thoại áp dụng cho những thiết bị hỗ trợ cả điện thoại và tính năng phát hiện vị trí, đồng thời người dùng đã bật chế độ Sử dụng thông tin vị trí để đặt múi giờ trong phần Cài đặt múi giờ. Chế độ này sẽ tự động bật khi thiết bị khởi động lại và khi chế độ trên máy bay bị tắt.

Trong Android 14 trở lên, chế độ dự phòng qua điện thoại có thể được kích hoạt thông qua các API trạng thái LTZP, tức là nếu một LTZP báo cáo rằng không chắc chắn khả năng phát hiện vị trí hoặc múi giờ của LTZP bị suy giảm do môi trường, thì chế độ dự phòng qua điện thoại sẽ được kích hoạt.

Khi ở chế độ dự phòng điện thoại, dịch vụ time_zone_detector sẽ sử dụng các đề xuất điện thoại như thể tính năng phát hiện vị trí bị tắt cho đến khi thuật toán vị trí đưa ra một đề xuất nhất định. Sau khi nhận được một đề xuất nhất định, chế độ dự phòng điện thoại sẽ bị tắt và chỉ sử dụng các đề xuất vị trí.

Để biết thông tin chi tiết về cấu hình cho chế độ dự phòng điện thoại, hãy xem phần Cấu hình phát hiện múi giờ.

Cài đặt múi giờ

Người dùng có thể bật và thiết lập chế độ cài đặt cho tính năng tự động phát hiện múi giờ trong ứng dụng Cài đặt AOSP.

Tính năng tự động phát hiện múi giờ trong phần Cài đặt

Hình 2. Tự động phát hiện múi giờ trong phần Cài đặt.

Bảng sau đây mô tả các chế độ kiểm soát của người dùng đối với tính năng phát hiện múi giờ trong ứng dụng Cài đặt AOSP.

*Trên Android 11 trở xuống, chế độ cài đặt này có tên là Sử dụng múi giờ do mạng cung cấp

Vị trí của phần Cài đặt AOSP Tên của phần Cài đặt AOSP Phạm vi Hành vi
Hệ thống > Ngày và giờ Tự động đặt múi giờ* Tất cả người dùng

Một nút bật/tắt.

Khi bạn bật chế độ này, thiết bị sẽ chịu trách nhiệm phát hiện múi giờ hiện tại. Khi ở trạng thái tắt, người dùng có thể dùng các chế độ kiểm soát để đặt múi giờ của thiết bị theo cách thủ công.

Hệ thống > Ngày và giờ Sử dụng thông tin vị trí để đặt múi giờ Người dùng hiện tại

Một nút bật/tắt.

Có trên Android 12. Nút bật/tắt này chỉ xuất hiện khi thiết bị hỗ trợ tính năng phát hiện múi giờ theo vị trí.

Để biết những thay đổi được giới thiệu trong Android 14, hãy xem phần Những thiết bị chỉ hỗ trợ tính năng phát hiện múi giờ theo vị trí.

Vị trí Sử dụng vị trí Người dùng hiện tại

Một nút bật/tắt.

Cho phép hoặc ngăn chặn việc sử dụng thông tin vị trí của thiết bị nói chung. Giá trị này có liên quan nếu thiết bị hỗ trợ tính năng phát hiện múi giờ theo vị trí.

Sau đây là thông tin tổng quan về hành vi của thiết bị đối với tính năng phát hiện múi giờ dựa trên các chế độ cài đặt mà người dùng chọn:

  • [Ngày và giờ] Tự động đặt múi giờ: TẮT

    • Người dùng phải chọn múi giờ theo cách thủ công.
  • [Ngày và giờ] Tự động đặt múi giờ: BẬT

    • [Vị trí] Sử dụng vị trí: TẮT

      • Các tín hiệu điện thoại được dùng để phát hiện múi giờ.
    • [Vị trí] Sử dụng vị trí: BẬT

      • [Ngày và giờ] Sử dụng thông tin vị trí để đặt múi giờ: BẬT

        • Thông tin vị trí được dùng để phát hiện múi giờ.
      • [Ngày và giờ] Sử dụng thông tin vị trí để đặt múi giờ: TẮT

        • Các tín hiệu điện thoại được dùng để phát hiện múi giờ.

Nhiều thiết bị người dùng

Vì một số chế độ cài đặt liên quan được giới hạn cho người dùng hiện tại, nên hành vi phát hiện múi giờ của thiết bị có thể thay đổi khi người dùng hiện tại thay đổi trên thiết bị chạy Android có nhiều người dùng.

Nút bật/tắt Sử dụng thông tin vị trí để đặt múi giờ chỉ áp dụng cho người dùng hiện tại và không bị hạn chế bởi chính sách thiết bị. Điều này có nghĩa là người dùng luôn có thể thay đổi giá trị của nút này, ngay cả khi nút bật/tắt Tự động đặt múi giờ đang tắt hoặc nếu Bộ điều khiển chính sách thiết bị hạn chế các chế độ kiểm soát khác về thời gian hoặc múi giờ.

 Thiết bị chỉ hỗ trợ thuật toán phát hiện múi giờ theo vị trí

Phần này mô tả hành vi của những thiết bị chỉ hỗ trợ thuật toán vị trí.

  • Android 14 trở lên

    • Người dùng sẽ không thấy lựa chọn Sử dụng dịch vụ vị trí trong ứng dụng Cài đặt AOSP và thiết bị sẽ hoạt động như thể lựa chọn Sử dụng dịch vụ vị trí đang bật.
    • Giá trị của chế độ cài đặt SettingsProvider ở phạm vi người dùng location_time_zone_detection_enabled sẽ bị bỏ qua. Giá trị này ghi lại lựa chọn ưu tiên của người dùng trên các loại thiết bị khác.
  • Android 12 hoặc Android 13

    • Người dùng có thể thấy lựa chọn Sử dụng thông tin vị trí trong ứng dụng Cài đặt AOSP và có thể tắt lựa chọn này. Nếu bạn tắt chế độ này, thiết bị sẽ không tự động phát hiện múi giờ.

Hành vi khi chuyển sang và chuyển từ chế độ phát hiện tự động

Khi người dùng chuyển chế độ phát hiện múi giờ từ thủ công sang tự động, time_zone_detector có thể đã biết chắc chắn múi giờ hiện tại. Nếu có, khi người dùng bật tính năng tự động phát hiện, múi giờ của thiết bị có thể được thay đổi cùng lúc để khớp với ý kiến của dịch vụ time_zone_detector.

Tương tự, khi người dùng thực hiện một thay đổi trong phần Cài đặt dẫn đến thay đổi đối với thuật toán hiện tại của dịch vụ time_zone_detector, time_zone_detector có thể đã nhận được các đề xuất cho thuật toán mới và do đó, thời gian của thiết bị có thể được thay đổi ngay lập tức để phù hợp với ý kiến của dịch vụ time_zone_detector.

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

Tính năng phát hiện múi giờ qua điện thoại sử dụng các tín hiệu điện thoại để xác định múi giờ hiện tại. Để biết thêm thông tin, hãy xem phần Phát hiện múi giờ của điện thoại.

Phát hiện múi giờ theo vị trí

Tính năng phát hiện múi giờ theo vị trí có trên Android 12 trở lên. Đây là một tính năng tự động phát hiện múi giờ không bắt buộc, cho phép thiết bị sử dụng thông tin vị trí để xác định múi giờ hiện tại.

Dịch vụ location_time_zone_manager (ra mắt trong Android 12) chạy trong máy chủ hệ thống và chứa mã chịu trách nhiệm gửi các đề xuất về thuật toán vị trí đến dịch vụ time_zone_detector. Để biết thêm thông tin, hãy xem bài viết Phát hiện múi giờ theo vị trí.

Những điểm cần cân nhắc khi áp dụng tính năng

Phần này mô tả các khía cạnh của tính năng phát hiện múi giờ theo vị trí để giúp nhà sản xuất thiết bị xác định xem có nên áp dụng tính năng này trên thiết bị hay không.

So sánh tính năng điện thoại và phát hiện vị trí

Bảng sau đây so sánh ưu và nhược điểm của việc sử dụng tín hiệu vị trí thay vì tín hiệu điện thoại để phát hiện múi giờ.

Danh mục Phát hiện dịch vụ điện thoại Phát hiện vị trí
Độ chính xác Thay đổi theo quốc gia.

Tuỳ thuộc vào mã quốc gia và mã mạng di động (MCC), độ chính xác và tình trạng sẵn có của NITZ.
Tuỳ thuộc vào cấu hình tính năng hoặc các thành phần bổ trợ.

Độ chính xác thường thay đổi theo:
  • Độ chính xác và tính thường xuyên của nhà cung cấp dịch vụ vị trí.
  • Chất lượng của dữ liệu bản đồ múi giờ.
Khả năng cập nhật Tính năng phát hiện dịch vụ điện thoại dựa vào các tệp có trong mô-đun Dữ liệu múi giờ có thể cập nhật (com.android.tzdata APEX). Tuỳ thuộc vào cấu hình tính năng hoặc các thành phần bổ trợ.

Khả năng cập nhật thường phụ thuộc vào việc thiết bị sử dụng dữ liệu bản đồ múi giờ của máy chủ hay ứng dụng.

Dữ liệu bản đồ múi giờ không có trong mô-đun Dữ liệu múi giờ dùng để cập nhật bản sao TZDB của Android và các thông tin khác về múi giờ.

Nhà sản xuất thiết bị cũng phải xem xét tính nhất quán về phiên bản giữa các quy tắc múi giờ và dữ liệu bản đồ múi giờ.
Mức sử dụng điện Không sử dụng hoặc sử dụng ít năng lượng Tuỳ thuộc vào chế độ cài đặt vị trí của người dùng, các trình bổ trợ đang được sử dụng và thường là những ứng dụng khác yêu cầu thông tin vị trí.
Phạm vi cung cấp Chỉ dành cho thiết bị điện thoại. Thường yêu cầu phải có một SIM đang hoạt động. Tính năng phát hiện vị trí phụ thuộc vào các nhà cung cấp dịch vụ vị trí có sẵn.
Quyền riêng tư của người dùng

Múi giờ ưu tiên của người dùng thường được xác định theo vị trí địa lý của họ. Vị trí là dữ liệu nhạy cảm. Người dùng có thể lo ngại về việc kiến thức về vị trí của họ được chia sẻ trong quá trình phát hiện múi giờ. Không liên quan đến tính năng phát hiện múi giờ, tất cả các ứng dụng chạy trên một thiết bị đều có thể đọc múi giờ hiện tại của thiết bị mà không cần có quyền của Android. Ngoài ra, các ứng dụng có thể suy luận một cách không chính xác về vị trí của thiết bị dựa trên thông tin này.

Cụ thể hơn, tính năng phát hiện múi giờ có thể hoạt động thông qua phương tiện thụ động hoặc chủ động:

  • Thụ động: Một yếu tố nào đó trong môi trường của thiết bị cho thiết bị biết múi giờ cần sử dụng trong môi trường đó.
  • Đang hoạt động: Thiết bị phải tự xác định múi giờ và tuỳ thuộc vào chế độ cài đặt quyền riêng tư cũng như sự đồng ý của người dùng, thiết bị sẽ lấy thông tin vị trí để thực hiện việc này. Sau đó, thiết bị có thể chia sẻ thông tin vị trí của mình với các dịch vụ bên ngoài. Hãy xem phần thảo luận bên dưới để biết thông tin chi tiết về quyền riêng tư và sự đồng ý của người dùng.

Tính năng phát hiện thụ động (chẳng hạn như bằng thuật toán điện thoại) không có thêm tác động nào đến quyền riêng tư của người dùng.

Tính năng phát hiện chủ động, chẳng hạn như bằng thuật toán vị trí, liên quan đến việc xác định vị trí của thiết bị mà người dùng có thể không muốn đồng ý. Vị trí này có thể được gửi qua mạng để xác định mã nhận dạng múi giờ.

Cách tiếp cận của Android đối với quyền riêng tư của người dùng trong việc phát hiện múi giờ cho phép người dùng tắt riêng lẻ các thuật toán dự kiến sẽ hoạt động. Ngoài ra, mã nền tảng AOSP không xử lý trực tiếp vị trí: việc phát hiện vị trí và ánh xạ vị trí đến mã nhận dạng múi giờ được dành cho các thành phần trình bổ trợ do nhà sản xuất thiết bị định cấu hình.

Để biết thêm thông tin về các tính năng bảo vệ quyền riêng tư của người dùng, hãy xem phần Phát hiện múi giờ theo vị trí.

Cấu hình

Các nhà sản xuất thiết bị có thể định cấu hình dịch vụ time_zone_detector để thay đổi hành vi của dịch vụ này. Phần này mô tả các lựa chọn cấu hình cho hành vi chung của dịch vụ time_zone_detector. Để biết thông tin chi tiết về cấu hình cho các thuật toán phát hiện múi giờ và điện thoại, hãy xem phần Phát hiện múi giờ điện thoạiPhát hiện múi giờ theo vị trí.

Cấu hình AOSP cơ sở nằm ở frameworks/base/core/res/res/values/config.xml.

Khoá cấu hình Giá trị AOSP Mô tả
config_supportTelephonyTimeZoneFallback true Khi true, time_zone_detector sử dụng chế độ dự phòng điện thoại. Tính năng này có trên Android 13 trở lên.

 Thay đổi hành vi mặc định của thiết bị

Trong AOSP, tính năng tự động phát hiện múi giờ được bật theo mặc định khi bạn đặt chế độ cài đặt auto_time_zone thành true. Để tắt tính năng tự động phát hiện thời gian theo mặc định, hãy đặt giá trị của def_auto_time_zone được xác định trong frameworks/base/packages/SettingsProvider/res/values/defaults.xml thành false.

Khi khôi phục dữ liệu sao lưu từ một thiết bị khác, theo mặc định, khung sẽ cập nhật giá trị của chế độ cài đặt auto_time_zone. Nếu bạn muốn đảm bảo rằng chế độ cài đặt này không được khôi phục từ bản sao lưu, hãy thêm auto_time_zone vào mảng restore_blocked_global_settings được xác định trong frameworks/base/packages/SettingsProvider/res/values/blocked_settings.xml.

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

Phần này cung cấp thông tin về cách gỡ lỗi và kiểm thử hành vi của dịch vụ time_zone_detector và các thành phần khác mà tất cả các thuật toán đều dùng chung.

Định cấu hình thiết bị bằng dịch vụ device_config

Dịch vụ device_config là một cơ chế được dùng trên Android để định cấu hình hành vi có thể sửa đổi bằng cách sử dụng các giá trị thường được mã độc quyền (không phải AOSP) kéo từ một máy chủ từ xa. Khi sử dụng các giá trị device_config để kiểm thử, đặc biệt là trong các kiểm thử thủ công chạy trong thời gian dài, thiết bị có thể đồng bộ hoá các cờ, điều này sẽ đặt lại các cờ và xoá các giá trị được đặt để kiểm thử.

Trong Android 12 trở lên, để tạm thời ngăn chặn quá trình đồng bộ hoá cờ, hãy dùng:

adb shell cmd device_config set_sync_disabled_for_tests persistent

Để khôi phục quá trình đồng bộ hoá cờ sau khi kiểm thử, hãy dùng:

adb shell cmd device_config set_sync_disabled_for_tests none

Sau khi khôi phục quá trình đồng bộ hoá cờ, hãy khởi động lại thiết bị.

Để biết thêm thông tin, hãy sử dụng $ adb shell cmd device_config help.

Tương tác với dịch vụ time_zone_detector

Để xem cấu hình time_zone_detector và trạng thái của dịch vụ time_zone_detector, hãy sử dụng:

adb shell cmd time_zone_detector dump

Để xem các lệnh bổ sung để gỡ lỗi và kiểm thử tính năng phát hiện múi giờ, hãy sử dụng:

adb shell cmd time_zone_detector help

Đầu ra trợ giúp cũng mô tả các thuộc tính dịch vụ device_config có thể dùng để ảnh hưởng đến hành vi của dịch vụ time_zone_detector cho mục đích kiểm thử hoặc trong quá trình phát hành công khai. Để biết thông tin chi tiết, hãy xem phần Định cấu hình thiết bị bằng dịch vụ device_config.

Để xác thực tính năng phát hiện múi giờ, người kiểm thử phải biết time_zone_detector đang sử dụng thuật toán nào. Để hiểu và tác động đến thuật toán hiện tại của time_zone_detector, hãy sử dụng một trong các lựa chọn sau:

  • Kiểm tra bằng mắt thông qua giao diện người dùng Cài đặt. Để biết thêm thông tin, hãy xem phần Cài đặt múi giờ.
  • Sử dụng dòng lệnh thông qua adb:

    • Để kết xuất trạng thái time_zone_detector, hãy sử dụng adb shell cmd time_zone_detector dump
    • Để thay đổi chế độ cài đặt thiết bị, hãy dùng các lệnh time_zone_detector khác. Để biết thêm thông tin, hãy sử dụng adb shell cmd time_zone_detector help.

Sau đây là ví dụ về kết quả đầu ra của lệnh adb shell cmd time_zone_detector dump, trong đó thông tin về thuật toán hiện tại và trạng thái dịch vụ được in đậm:

$ adb shell cmd time_zone_detector dump
TimeZoneDetectorStrategy:
  mEnvironment.getCurrentUserId()=0
  mEnvironment.getConfiguration(currentUserId)=ConfigurationInternal{mUserId=0, mUserConfigAllowed=true, mTelephonyDetectionSupported=true, mGeoDetectionSupported=true, mAutoDetectionEnabled=true, mLocationEnabled=true, mGeoDetectionEnabled=true}
  [Capabilities=TimeZoneCapabilitiesAndConfig{mCapabilities=TimeZoneDetectorCapabilities{mUserHandle=UserHandle{0}, mConfigureAutoDetectionEnabledCapability=40, mConfigureGeoDetectionEnabledCapability=40, mSuggestManualTimeZoneCapability=30}, mConfiguration=TimeZoneConfiguration{mBundle=Bundle[{geoDetectionEnabled=true, autoDetectionEnabled=true}]}}]
  mEnvironment.isDeviceTimeZoneInitialized()=true
  mEnvironment.getDeviceTimeZone()=Europe/London
  Time zone change log:
  Manual suggestion history:
...
  Geolocation suggestion history:
...
  Telephony suggestion history:
...

Bạn có thể diễn giải thông tin này như sau:

Khóa Giá trị
mUserConfigAllowed Trình điều khiển chính sách thiết bị có ngăn người dùng kiểm soát chế độ cài đặt ngày và giờ hay không.
mTelephonyDetectionSupported Xem thiết bị có tính năng phát hiện múi giờ qua điện thoại hay không.
mGeoDetectionSupported Thiết bị có hỗ trợ tính năng phát hiện múi giờ theo vị trí hay không. Đây là trạng thái hiệu quả dựa trên cấu hình sự hiện diện của ít nhất một LTZP.
mAutoDetectionEnabled Cho biết bạn đã bật tính năng tự động phát hiện múi giờ hay chưa.
mLocationEnabled Nút bật/tắt vị trí chính.
mGeoDetectionEnabled Công tắc thuật toán: false cho biết thuật toán điện thoại và true cho biết thuật toán vị trí.

Thông tin về nhật ký đề xuất cho biết những đề xuất đã được đưa ra thông qua phần Cài đặt (thủ công), cũng như bằng các thuật toán điện thoại và vị trí.