Phát hiện thời gian mạng

Các thiết bị Android sẽ tự động tìm cách lấy thời gian Unix chính xác từ một nguồn mạng. Android sử dụng giao thức SNTP, sử dụng giao thức UDP, để lấy thông tin thời gian.

Các thành phần được mô tả trên trang này là một phần của hệ thống phát hiện thời gian tự động, được gọi là nguồn gốc thời gian mạng. Bạn có thể dùng tín hiệu thời gian từ máy chủ thời gian mạng để đặt đồng hồ hệ thống của thiết bị Android khi tính năng phát hiện thời gian tự động được hỗ trợ trên thiết bị và dịch vụ time_detector được định cấu hình để sử dụng tín hiệu đó.

Theo mặc định, Android sử dụng nguồn gốc thời gian mạng làm nguồn gốc chính của tính năng phát hiện thời gian tự động.

Hệ thống phát hiện thời gian mạng

Dịch vụ network_time_update_service chạy trong máy chủ hệ thống Android sẽ triển khai hệ thống phát hiện thời gian mạng. Dịch vụ này định kỳ sử dụng SNTP để lấy tín hiệu thời gian từ máy chủ. Dịch vụ này cũng theo dõi kết nối mạng và kích hoạt tính năng làm mới thời gian khi không có tín hiệu thời gian gần đây sau thời gian dài kết nối kém.

Dịch vụ network_time_update_service sẽ cố gắng lấy tín hiệu thời gian sau khi khởi động và khi kết nối mạng được thiết lập lần đầu. Sau đó, dịch vụ sẽ cố gắng làm mới tín hiệu mới nhất mà dịch vụ lưu giữ. Tính năng này cân bằng nhu cầu của từng thiết bị Android với tải đáng kể có thể do nhiều thiết bị Android trên toàn thế giới tạo ra khi làm mới thời gian của họ.

Khi sử dụng các API nội bộ, network_time_update_service sẽ gửi các đề xuất về thời gian mạng đến dịch vụ time_detector. Sau đó, các thành phần khác của nền tảng Android sẽ sử dụng các đề xuất về thời gian mạng này.

Sau khi nhận được đề xuất từ nguồn thời gian mạng, dịch vụ time_detector sẽ xác định xem có cập nhật đồng hồ hệ thống theo các quy tắc ưu tiên đã định cấu hình hay không.

Để định cấu hình hệ thống phát hiện thời gian tự động sử dụng các đề xuất về nguồn gốc mạng để tự động đặt đồng hồ hệ thống, hãy sử dụng tệp cấu hình máy chủ hệ thống core/res/res/values/config.xml. Đảm bảo giá trị network có trong config_autoTimeSourcesPriority ở vị trí mong muốn. Để biết thông tin chi tiết, hãy xem phần Mức độ ưu tiên nguồn thời gian.

Cấu hình thiết bị

Phần này mô tả cách nhà sản xuất thiết bị có thể định cấu hình hệ thống phát hiện thời gian mạng.

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_ntpRetry 3 Sau khi không làm mới được, đây là số lần hệ thống thử thăm dò thời gian mạng bằng khoảng thời gian thăm dò NTP ngắn hơn (config_ntpPollingIntervalShorter), trước khi lùi lại và sử dụng khoảng thời gian thăm dò thông thường (config_ntpPollingInterval). Giá trị nhỏ hơn 0 có nghĩa là hệ thống sẽ thử lại thăm dò ở khoảng thời gian thăm dò NTP ngắn hơn cho đến khi có thể làm mới thành công.
config_ntpPollingInterval 64800000 (18 giờ) Khoảng thời gian thăm dò thời gian mạng thông thường tính bằng mili giây.
config_ntpPollingIntervalShorter 60000 (1 phút) Khoảng thời gian thăm dò thời gian mạng thử lại tính bằng mili giây. Được dùng khi làm mới thời gian không thành công.
config_ntpServers Một mục nhập: ntp://time.android.com Máy chủ NTP để sử dụng nhằm lấy thời gian chính xác. Các mục phải ở dạng: ntp://<host>[:port].
Đây không phải là giao thức URI IANA đã đăng ký.
config_ntpTimeout 5000 Thời gian chờ phản hồi của máy chủ NTP tính bằng mili giây trước khi hết thời gian chờ.

Máy chủ

Theo mặc định, AOSP sử dụng các máy chủ thời gian tại time.android.com, đây là bí danh của NTP công khai của Google. Dịch vụ này không có thoả thuận mức độ cung cấp dịch vụ (SLA). Để biết thông tin chi tiết, hãy xem Câu hỏi thường gặp về NTP công khai của Google.

Hỗ trợ nhiều máy chủ

Đối với Android 14 trở lên, khung này hỗ trợ nhiều máy chủ NTP. Điều này hỗ trợ các trường hợp thiết bị được phân phối trên toàn cầu với một cấu hình duy nhất, nhưng quyền truy cập vào các máy chủ như time.android.com bị hạn chế ở một số nơi.

Thuật toán sẽ thử từng máy chủ được chỉ định trong khoá cấu hình config_ntpServers. Khi tìm thấy một máy chủ phản hồi, hệ thống sẽ tiếp tục sử dụng máy chủ đó cho đến khi không làm mới được hoặc thiết bị khởi động lại.

 Độ chính xác

Tính năng đồng bộ hoá thời gian mạng mặc định của Android sử dụng SNTP với một truy vấn một lần khoảng một lần mỗi ngày để cố gắng đảm bảo tính năng này luôn có tín hiệu thời gian gần đây.

Hiệu ứng về độ trễ mạng là yếu tố quan trọng nhất khiến thời gian không chính xác khi triển khai SNTP của Android. SNTP giả định độ trễ mạng đối xứng, tức là độ trễ mạng cho yêu cầu giống với độ trễ mạng cho phản hồi và thời gian chính xác nằm chính giữa lượt truy cập mạng đó. Thông thường, thời gian truyền dữ liệu qua lại trên mạng ở mức vài trăm mili giây và trên mạng có dây, độ trễ gần như đối xứng, dẫn đến mức độ không chính xác gần như không thể nhận thấy đối với người dùng. Tuy nhiên, với điện thoại di động hoặc điện thoại vô tuyến, có một số giai đoạn có thể chèn độ trễ không đối xứng tương đối dài vào giao dịch mạng, dẫn đến độ không chính xác cao hơn.

Với chế độ cài đặt mặc định của AOSP cho config_ntpTimeout được đặt thành 5000 mili giây, và nếu tất cả độ trễ mạng chỉ tập trung vào chặng đến hoặc đi, thì lỗi lý thuyết tối đa là khoảng 2,5 giây.

Độ chính xác tổng thể của đồng hồ hệ thống cũng chịu ảnh hưởng của khả năng theo dõi chính xác thời gian đã trôi qua của thiết bị Android sau khi nhận được tín hiệu thời gian. Đây là vấn đề liên quan đến tất cả các hoạt động theo dõi thời gian trên Android, chứ không chỉ việc phát hiện thời gian mạng. Đây cũng là lý do dịch vụ time_detector bỏ qua các đề xuất về thời gian cũ. Dịch vụ network_time_update_service làm mới thường xuyên bằng cách sử dụng khoảng thời gian config_ntpPollingInterval để cung cấp cho dịch vụ time_detector các đề xuất thời gian mới và đảm bảo rằng dịch vụ time_detector không quay lại các nguồn gốc thời gian có mức độ ưu tiên thấp hơn và thường có độ chính xác thấp hơn hoặc đôi khi không chính xác, chẳng hạn như telephony.

Khi sử dụng tính năng tự động phát hiện thời gian, độ chính xác của đồng hồ hệ thống thiết bị có thể bị ảnh hưởng bởi các cấu hình khác của dịch vụ time_detector, chẳng hạn như các hằng số và cờ ảnh hưởng đến mức độ khác biệt giữa thời gian đề xuất và thời gian đồng hồ hệ thống hiện tại trước khi điều chỉnh đồng hồ (ServiceConfigAccessorImpl.java).

Nhà sản xuất thiết bị có thể sửa đổi độ chính xác bằng cách sử dụng các tuỳ chọn và hằng số cấu hình trước đó. Tuy nhiên, điều quan trọng là bạn phải nhận biết được các hạn chế của việc triển khai SNTP của nền tảng và tác động tiềm ẩn đến mức tiêu thụ điện năng từ các hoạt động mạng thường xuyên hơn, tác động đến các ứng dụng chạy trên thiết bị từ việc điều chỉnh đồng hồ thường xuyên hơn nhưng nhỏ hơn và tác động đến tải máy chủ.

Các cách sử dụng khác của thời gian mạng

Nếu bạn chưa thiết lập tính năng tự động phát hiện thời gian bằng nguồn gốc network hoặc nếu người dùng đã tắt tính năng tự động phát hiện thời gian, thì thời gian mà dịch vụ network_time_update_service có được vẫn được các thành phần sau sử dụng:

  • Phương thức SystemClock.currentNetworkTimeClock().
  • Hàm nền tảng nội bộ. Ví dụ: A-GPS có thể xác định vị trí của lần sửa lỗi đầu tiên của GNSS (vị trí) nhanh hơn khi có thông tin về thời gian mạng.

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 thời gian mạng.

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

Để kết xuất trạng thái hiện tại của network_time_update_service, hãy sử dụng:

adb shell cmd network_time_update_service dump

Để xem tập hợp các tuỳ chọn dòng lệnh có thể hỗ trợ kiểm thử, hãy sử dụng:

adb shell cmd network_time_update_service help